Imports StaxRip.UI Partial Public Class MainForm Inherits FormBase Sub ShowOptionsDialog() ShowOptionsDialog(Nothing) End Sub Sub ShowOptionsDialog(pagePath As String) Using form As New SimpleSettingsForm( "Project Options", "In order to save project options go to:", "File > Save Project As Template", "In order to select a template to be loaded on program startup go to:", "Tools > Settings > General > Templates > Default Template") form.ScaleClientSize(38, 30) Dim ui = form.SimpleUI ui.Store = p ' ---------------------------------------------------------------- ui.CreateFlowPage("Image", True) Dim n = ui.AddNum() n.Text = "Auto resize image size" n.Help = "Resizes to a given pixel size after loading a source file." n.Config = {0, Integer.MaxValue, 10000} n.Field = NameOf(p.AutoResizeImage) ui.AddLabel(n, "(0 = disabled)") Dim m = ui.AddMenu(Of Integer)() m.Text = "Output Mod" m.Add(2, 4, 8, 16) m.Field = NameOf(p.ForcedOutputMod) Dim dirMenu = ui.AddMenu(Of ForceOutputModDirection)() dirMenu.Text = "Output Mod Direction" dirMenu.Field = NameOf(p.ForcedOutputModDirection) Dim b = ui.AddBool() b.Text = "Make Output Mod warning ignorable" b.Field = NameOf(p.ForcedOutputModIgnorable) b = ui.AddBool() b.Text = "Warn on invalid Output Mod only if video is cropped" b.Field = NameOf(p.ForcedOutputModOnlyIfCropped) ' ---------------------------------------------------------------- ui.CreateFlowPage("Image | Aspect Ratio", True) b = ui.AddBool() b.Text = "Use ITU-R BT.601 compliant aspect ratio" b.Help = "Calculates the aspect ratio according to ITU-R BT.601 standard." b.Field = NameOf(p.ITU) b = ui.AddBool() b.Text = "Adjust height according to target display aspect ratio" b.Help = "Adjusts the height to match the target display aspect ratio in case the auto resize option is disabled." b.Field = NameOf(p.AdjustHeight) n = ui.AddNum() n.Text = "Max AR Error" n.Help = "Maximum aspect ratio error. In case of a higher value the AR signaled to the encoder or muxer." n.Config = {1, 10, 0.1, 1} n.Field = NameOf(p.MaxAspectRatioError) Dim t = ui.AddText() t.Text = "Source DAR" t.Help = "Custom source display aspect ratio." t.Field = NameOf(p.CustomSourceDAR) t = ui.AddText() t.Text = "Source PAR" t.Help = "Custom source pixel aspect ratio." t.Field = NameOf(p.CustomSourcePAR) t = ui.AddText() t.Text = "Target DAR" t.Help = "Custom target display aspect ratio." t.Field = NameOf(p.CustomTargetDAR) t = ui.AddText() t.Text = "Target PAR" t.Help = "Custom target pixel aspect ratio." t.Field = NameOf(p.CustomTargetPAR) ' ---------------------------------------------------------------- Dim cropPage = ui.CreateFlowPage("Image | Crop", True) b = ui.AddBool() b.Text = "Auto correct crop values" b.Help = "Force crop values compatible with YUV/YV12 colorspace and with the forced output mod value. " b.Field = NameOf(p.AutoCorrectCropValues) b = ui.AddBool() b.Text = "Auto crop borders until proper aspect ratio is found" b.Help = "Automatically crops borders until the proper aspect ratio is found." b.Field = NameOf(p.AutoSmartCrop) n = ui.AddNum() n.Text = "Auto overcrop width to limit aspect ratio to" n.Help = "On small devices it can help to restrict the aspect ratio and overcrop the width instead." n.Config = {0, 2, 0.1, 3} n.Field = NameOf(p.AutoSmartOvercrop) b = ui.AddBool() b.Text = "Tonemapping for HDR videos" b.Help = "Tonemap sources with a higher Bit Depth than 8bit." b.Enabled = Vulkan.IsSupported b.Field = NameOf(p.CropWithTonemapping) b.Checked = b.Checked AndAlso Vulkan.IsSupported b = ui.AddBool() b.Text = "High contrast for easier cropping" b.Help = "" b.Field = NameOf(p.CropWithHighContrast) ui.AddLine(cropPage, "Custom crop values") Dim eb = ui.AddEmptyBlock(cropPage) ui.AddLabel(eb, "Left:", 2) Dim leftCrop = ui.AddNumeric(eb) ui.AddLabel(eb, "Right:", 4) Dim rightCrop = ui.AddNumeric(eb) eb = ui.AddEmptyBlock(cropPage) ui.AddLabel(eb, "Top:", 2) Dim topCrop = ui.AddNumeric(eb) ui.AddLabel(eb, "Bottom:", 4) Dim bottomCrop = ui.AddNumeric(eb) leftCrop.Value = p.CropLeft leftCrop.Config = {0, 9999, 2, 0} rightCrop.Value = p.CropRight rightCrop.Config = leftCrop.Config topCrop.Value = p.CropTop topCrop.Config = {0, 9999, 2, 0} bottomCrop.Value = p.CropBottom bottomCrop.Config = topCrop.Config ' ---------------------------------------------------------------- Dim autoCropPage = ui.CreateFlowPage("Image | Crop | Auto Crop", True) Dim autoCropMode = ui.AddMenu(Of AutoCropMode) ui.AddLine(autoCropPage, "General") 'dim l = ui.AddLabel("Regular AutoCrop settings:", 0, FontStyle.Bold) 'l.Margin = New Padding(0, 10, 0, 0) Dim autoCropSideMode = ui.AddMenu(Of AutoCropSideMode) Dim autoCropFrameRangeMode = ui.AddMenu(Of AutoCropFrameRangeMode) Dim thresholdEb = ui.AddEmptyBlock(autoCropPage) thresholdEb.Margin = New Padding(0, 6, 0, 3) Dim l = ui.AddLabel(thresholdEb, "Threshold at:", 7) ui.AddLabel(thresholdEb, "Beginning:", 2) Dim thresholdBegin = ui.AddNumeric(thresholdEb) ui.AddLabel(thresholdEb, " ", 1) ui.AddLabel(thresholdEb, "Ending:", 2) Dim thresholdEnd = ui.AddNumeric(thresholdEb) thresholdBegin.Help = "Number of frames at the beginning of the video, that are ignored when setting the crop values." thresholdBegin.Config = {0, 999999, 25, 0} thresholdBegin.Field = NameOf(p.AutoCropFrameRangeThresholdBegin) thresholdEnd.Help = "Number of frames at the ending of the video, that are ignored when setting the crop values." thresholdEnd.Config = thresholdBegin.Config thresholdEnd.Field = NameOf(p.AutoCropFrameRangeThresholdEnd) autoCropSideMode.Text = "Side Selection Mode" autoCropSideMode.Help = "Decide which sides shall be cropped." autoCropSideMode.Expanded = True autoCropSideMode.Field = NameOf(p.AutoCropSideMode) autoCropFrameRangeMode.Text = "Frame Range Mode" autoCropFrameRangeMode.Help = "Defines the range frames are considered to be taken into account for processing:" + BR2 + "Automatic: Depending on video length a small portion of the beginning and end will be ignored." + BR + "Complete: The whole video length will be used." + BR + "Manual Threshold: Define your own number of frames at beginning and end that will be ignored." autoCropFrameRangeMode.Expanded = True autoCropFrameRangeMode.Field = NameOf(p.AutoCropFrameRangeMode) autoCropFrameRangeMode.Button.ValueChangedAction = Sub(value) Dim active = autoCropFrameRangeMode.Enabled Dim activeAutomaticRange = active AndAlso value = StaxRip.AutoCropFrameRangeMode.Automatic Dim activeCompleteRange = active AndAlso value = StaxRip.AutoCropFrameRangeMode.Complete Dim activeManualThresholdRange = active AndAlso value = StaxRip.AutoCropFrameRangeMode.ManualThreshold thresholdEb.Visible = activeManualThresholdRange End Sub autoCropFrameRangeMode.Button.ValueChangedAction.Invoke(p.AutoCropFrameRangeMode) Dim autoCropFrameSelectionMode = ui.AddMenu(Of AutoCropFrameSelectionMode) Dim fsFixedFrames = ui.AddNum() fsFixedFrames.Text = "Number of frames:" fsFixedFrames.Help = "Fixed number of frames being analyzed over the whole video." fsFixedFrames.Config = {1, 7200, 5, 0} fsFixedFrames.Field = NameOf(p.AutoCropFixedFramesFrameSelection) fsFixedFrames.Margin = New Padding(0, 6, 0, 3) Dim fsFrameInterval = ui.AddNum() fsFrameInterval.Text = "Frame interval:" fsFrameInterval.Help = "Frame interval betwen analyzed frames." fsFrameInterval.Config = {1, 3600, 5, 0} fsFrameInterval.Field = NameOf(p.AutoCropFrameIntervalFrameSelection) fsFrameInterval.Margin = New Padding(0, 6, 0, 3) Dim fsTimeInterval = ui.AddNum() fsTimeInterval.Text = "Time interval in seconds:" fsTimeInterval.Help = "Time interval in seconds betwen analyzed frames." fsTimeInterval.Config = {1, 3600, 5, 0} fsTimeInterval.Field = NameOf(p.AutoCropTimeIntervalFrameSelection) fsTimeInterval.Margin = New Padding(0, 6, 0, 3) Dim luminanceThreshold = ui.AddNum() luminanceThreshold.Text = "Luminance Threshold in percent:" luminanceThreshold.Help = "Max brightness in peercent of those lines, that are considered to be cropped." luminanceThreshold.Config = {0, 99, 0.1, 1} luminanceThreshold.Field = NameOf(p.AutoCropLuminanceThreshold) luminanceThreshold.Margin = New Padding(0, 6, 0, 3) ui.AddLine(autoCropPage, "Dolby Vision") Dim autoCropDVMode = ui.AddMenu(Of AutoCropDolbyVisionMode)() Dim doviThresholdEb = ui.AddEmptyBlock(autoCropPage) doviThresholdEb.Margin = New Padding(0, 6, 0, 3) l = ui.AddLabel(doviThresholdEb, "Threshold at:", 7) ui.AddLabel(doviThresholdEb, "Beginning:", 2) Dim doviThresholdBegin = ui.AddNumeric(doviThresholdEb) ui.AddLabel(doviThresholdEb, " ", 1) ui.AddLabel(doviThresholdEb, "Ending:", 2) Dim doviThresholdEnd = ui.AddNumeric(doviThresholdEb) Dim autoCropDVSideMode = ui.AddMenu(Of AutoCropDolbyVisionSideMode)() autoCropDVMode.Text = "Threshold Mode" autoCropDVMode.Help = "Decide between an automatic mode and a manual threshold to ignore a number of frames at the beginning and/or end." autoCropDVMode.Expanded = True autoCropDVMode.Field = NameOf(p.AutoCropDolbyVisionMode) autoCropDVMode.Button.ValueChangedAction = Sub(value) Dim active = value = AutoCropDolbyVisionMode.ManualThreshold doviThresholdEb.Visible = active End Sub autoCropDVMode.Button.ValueChangedAction.Invoke(p.AutoCropDolbyVisionMode) autoCropDVSideMode.Text = "Side Selection Mode" autoCropDVSideMode.Help = "Decide which sides shall be cropped." autoCropDVSideMode.Expanded = True autoCropDVSideMode.Field = NameOf(p.AutoCropDolbyVisionSideMode) autoCropFrameSelectionMode.Text = "Frame Selection Mode" autoCropFrameSelectionMode.Help = "" autoCropFrameSelectionMode.Expanded = True autoCropFrameSelectionMode.Field = NameOf(p.AutoCropFrameSelectionMode) autoCropFrameSelectionMode.Button.ValueChangedAction = Sub(value) Dim active = autoCropFrameSelectionMode.Enabled Dim activeFixedFrames = active AndAlso value = StaxRip.AutoCropFrameSelectionMode.FixedFrames Dim activeFrameInterval = active AndAlso value = StaxRip.AutoCropFrameSelectionMode.FrameInterval Dim activeTimeInterval = active AndAlso value = StaxRip.AutoCropFrameSelectionMode.TimeInterval fsFixedFrames.Visible = activeFixedFrames fsFrameInterval.Visible = activeFrameInterval fsTimeInterval.Visible = activeTimeInterval End Sub autoCropFrameSelectionMode.Button.ValueChangedAction.Invoke(p.AutoCropFrameSelectionMode) autoCropMode.Text = "Auto Crop after opening" autoCropMode.Help = "Use Auto Crop when a file is opened to crop it directly." autoCropMode.Expanded = True autoCropMode.Field = NameOf(p.AutoCropMode) autoCropMode.Button.ValueChangedAction = Sub(value) autoCropDVMode.Button.ValueChangedAction.Invoke(autoCropDVMode.Button.Value) autoCropFrameSelectionMode.Button.ValueChangedAction.Invoke(autoCropFrameSelectionMode.Button.Value) End Sub autoCropMode.Button.ValueChangedAction.Invoke(p.AutoCropMode) doviThresholdBegin.Help = "Number of frames at the beginning of the video, that are ignored when setting the crop values." doviThresholdBegin.Config = {0, 999999, 25, 0} doviThresholdBegin.Field = NameOf(p.AutoCropDolbyVisionThresholdBegin) doviThresholdEnd.Help = "Number of frames at the ending of the video, that are ignored when setting the crop values." doviThresholdEnd.Config = doviThresholdBegin.Config doviThresholdEnd.Field = NameOf(p.AutoCropDolbyVisionThresholdEnd) ' ---------------------------------------------------------------- Dim generalPage = ui.CreateFlowPage("General", True) Dim takeOverTitle = ui.AddBool() takeOverTitle.Text = "Take over title" takeOverTitle.Help = "Take over title from source file - Title Name in container options must be empty!" takeOverTitle.Checked = p.TakeOverTitle takeOverTitle.SaveAction = Sub(value) p.TakeOverTitle = value ' ---------------------------------------------------------------- Dim videoPage = ui.CreateFlowPage("Video", True) Dim videoExist = ui.AddMenu(Of FileExistMode) Dim demuxVideo = ui.AddBool() Dim takeOverVideoLanguage = ui.AddBool() Dim importVui = ui.AddBool() Dim extractHdrmetadata = ui.AddMenu(Of HdrmetadataMode) videoExist.Text = "Existing Video Output" videoExist.Help = "What to do in case the video encoding output file already exists from a previous job run, skip and reuse or re-encode and overwrite. The 'Copy/Mux' video encoder profile is also capable of reusing existing video encoder output.'" videoExist.Expanded = True videoExist.Field = NameOf(p.FileExistVideo) demuxVideo.Text = "Demux Video" demuxVideo.Field = NameOf(p.DemuxVideo) takeOverVideoLanguage.Text = "Take over language" takeOverVideoLanguage.Field = NameOf(p.TakeOverVideoLanguage) importVui.Text = "Import VUI metadata" importVui.Help = "Imports VUI metadata such as HDR from the source file to the video encoder." importVui.Field = NameOf(p.ImportVUIMetadata) extractHdrmetadata.Text = "Extract HDR metadata" extractHdrmetadata.Help = "Extract dynamic HDR10+ and DolbyVision metadata if available" extractHdrmetadata.Expanded = True extractHdrmetadata.Field = NameOf(p.ExtractHdrmetadata) extractHdrmetadata.Button.ValueChangedAction = Sub(value) Dim visible = value = HdrmetadataMode.All OrElse value = HdrmetadataMode.DolbyVision End Sub ui.AddLine() n = ui.AddNum() n.Text = "Min. duration for BDMV playlists:" n.Help = "Duration in seconds. A value of '-1' will bypass the custom value and take eac3to's default value instead." n.Config = {-1, 3600, 1, 0} n.Field = NameOf(p.MinBdmvPlaylistDuration) n = ui.AddNum() n.Text = "Film Threshold for D2V files:" n.Help = "" n.Config = {0, 100, 0.1, 2} n.Field = NameOf(p.D2VAutoForceFilmThreshold) ' ---------------------------------------------------------------- Dim audioPage = ui.CreateFlowPage("Audio", True) n = ui.AddNum n.Text = "Audio Tracks" n.Config = {2, 20, 1} n.Field = NameOf(p.AudioTracksAvailable) 'n.NumEdit.SaveAction = Sub(x) SetAudioTracks(CType(x, Integer)) Dim prefAudio = ui.AddTextMenu prefAudio.Text = "Preferred Languages" prefAudio.Help = "List of audio tracks to demux." prefAudio.Field = NameOf(p.PreferredAudio) For x = 1 To 9 Dim temp = x prefAudio.AddMenu("Choose ID | " & x, Sub() prefAudio.Edit.Text += " " & temp) Next prefAudio.AddMenu("Choose All", "all") prefAudio.AddMenu("-", "") For i = 0 To Language.Languages.Count - 1 Dim lng = Language.Languages(i) If lng.IsCommon Then prefAudio.AddMenu(lng.ToString + " (" + lng.TwoLetterCode + ", " + lng.ThreeLetterCode + ")", Sub() prefAudio.Edit.Text += " " + lng.ThreeLetterCode) End If Next Dim moreAudio = prefAudio.AddMenu("More", DirectCast(Nothing, Action)) Dim moreAudioFirst = prefAudio.AddMenu("More | temp", DirectCast(Nothing, Action)) Dim moreAudioAction = Sub() For Each lng In Language.Languages prefAudio.AddMenu("More | " + lng.ToString.Substring(0, 1).ToUpperInvariant + " | " + lng.ToString + " (" + lng.TwoLetterCode + ", " + lng.ThreeLetterCode + ")", Sub() prefAudio.Edit.Text += " " + lng.ThreeLetterCode) Next End Sub AddHandler moreAudio.DropDownOpened, Sub() If moreAudio.DropDownItems.Count > 1 Then Exit Sub End If moreAudioFirst.Visible = False moreAudioAction() End Sub Dim cut = ui.AddMenu(Of CuttingMode) cut.Text = "Cutting Method" cut.Help = "Defines which method to use for cutting." cut.Field = NameOf(p.CuttingMode) Dim demuxAudio = ui.AddMenu(Of DemuxMode) demuxAudio.Text = "Demux Audio" demuxAudio.Field = NameOf(p.DemuxAudio) Dim audioExist = ui.AddMenu(Of FileExistMode) audioExist.Text = "Existing Output" audioExist.Help = "What to do in case an audio encoding output file already exists from a previous job run, skip and reuse or re-encode and overwrite." audioExist.Field = NameOf(p.FileExistAudio) Dim audioIntermediateWavBitDepth = ui.AddMenu(Of IntermediateWaveBitDepth) audioIntermediateWavBitDepth.Text = "Intermediate Wave Bit Depth" audioIntermediateWavBitDepth.Help = "In case you choose WAV as intermediate format for audio encoding, you can choose the bit depth. The higher the better, but also needs more disk space and probably time." audioIntermediateWavBitDepth.Field = NameOf(p.AudioIntermediateWaveBitDepth) b = ui.AddBool b.Text = "Take over Stream Name if profile is empty" b.Field = NameOf(p.TakeOverAudioName) b = ui.AddBool b.Text = "Take over Default flag" b.Field = NameOf(p.TakeOverAudioDefault) b = ui.AddBool b.Text = "Take over Forced flag" b.Field = NameOf(p.TakeOverAudioForced) b = ui.AddBool b.Text = "On load use AviSynth script as audio source" b.Help = "Sets the AviSynth script (*.avs) as audio source file when loading a source file." b.Field = NameOf(p.UseScriptAsAudioSource) ' ---------------------------------------------------------------- Dim subPage = ui.CreateFlowPage("Subtitles", True) Dim subMode = ui.AddMenu(Of SubtitleMode) subMode.Expanded = True subMode.Text = "Subtitles" subMode.Field = NameOf(p.SubtitleMode) Dim prefSub = ui.AddTextMenu(subPage) prefSub.Text = "Languages" prefSub.Help = "List of used subtitle languages." prefSub.Field = NameOf(p.PreferredSubtitles) For x = 1 To 9 Dim temp = x prefSub.AddMenu("Choose ID | " & x, Sub() prefSub.Edit.Text += " " & temp) Next prefSub.AddMenu("Choose All", "all") prefSub.AddMenu("-", "") For Each lng In Language.Languages If lng.IsCommon Then prefSub.AddMenu(lng.ToString + " (" + lng.TwoLetterCode + ", " + lng.ThreeLetterCode + ")", Sub() prefSub.Edit.Text += " " + lng.ThreeLetterCode) End If Next Dim moreSub = prefSub.AddMenu("More", DirectCast(Nothing, Action)) Dim moreSubFirst = prefSub.AddMenu("More | temp", DirectCast(Nothing, Action)) Dim moreSubAction = Sub() For Each lng In Language.Languages prefSub.AddMenu("More | " + lng.ToString.Substring(0, 1).ToUpperInvariant + " | " + lng.ToString + " (" + lng.TwoLetterCode + ", " + lng.ThreeLetterCode + ")", Sub() prefSub.Edit.Text += " " + lng.ThreeLetterCode) Next End Sub AddHandler moreSub.DropDownOpened, Sub() If moreSub.DropDownItems.Count > 1 Then Exit Sub End If moreSubFirst.Visible = False moreSubAction() End Sub Dim tbm = ui.AddTextMenu(subPage) tbm.Text = "Track Name" tbm.Help = "Track name used for muxing, may contain macros." tbm.Field = NameOf(p.SubtitleName) tbm.AddMenu("Language English", "%language_english%") tbm.AddMenu("Language Native", "%language_native%") Dim mb = ui.AddMenu(Of DefaultSubtitleMode)(subPage) mb.Text = "Default Subtitle" mb.Field = NameOf(p.DefaultSubtitle) b = ui.AddBool(subPage) b.Text = "Convert Sup (PGS/Blu-ray) to IDX (Sub/VobSub/DVD)" b.Help = "Works only with demuxed subtitles." b.Field = NameOf(p.ConvertSup2Sub) b = ui.AddBool(subPage) b.Text = "Extract forced subtitles from IDX files (Sub/VobSub/DVD)" b.Help = "Works only with demuxed subtitles." b.Field = NameOf(p.ExtractForcedSubSubtitles) b = ui.AddBool(subPage) b.Text = "Add hardcoded subtitle" b.Help = "Automatically hardcodes a subtitle." + BR2 + "Supported formats are SRT, ASS and VobSub." b.Field = NameOf(p.HardcodedSubtitle) ' ---------------------------------------------------------------- Dim chaptersPage = ui.CreateFlowPage("Chapters", True) b = ui.AddBool(chaptersPage) b.Text = "Demux Chapters" b.Checked = p.DemuxChapters b.SaveAction = Sub(val) p.DemuxChapters = val ' ---------------------------------------------------------------- Dim timestampsPage = ui.CreateFlowPage("Timestamps", True) Dim timestamps = ui.AddMenu(Of TimestampsMode) timestamps.Expanded = False timestamps.Text = "Extract timestamps from MKV files (if existing)" timestamps.Field = NameOf(p.ExtractTimestamps) ' ---------------------------------------------------------------- Dim attachmentsPage = ui.CreateFlowPage("Attachments", True) b = ui.AddBool(attachmentsPage) b.Text = "Demux Attachments" b.Checked = p.DemuxAttachments b.SaveAction = Sub(val) p.DemuxAttachments = val b = ui.AddBool(attachmentsPage) b.Text = "Add Attachments to Muxing" b.Checked = p.AddAttachmentsToMuxer b.SaveAction = Sub(val) p.AddAttachmentsToMuxer = val ' ---------------------------------------------------------------- Dim tagsPage = ui.CreateFlowPage("Tags", True) b = ui.AddBool(tagsPage) b.Text = "Demux Tags" b.Checked = p.DemuxTags b.SaveAction = Sub(val) p.DemuxTags = val b = ui.AddBool(tagsPage) b.Text = "Add Tags to Muxing" b.Checked = p.AddTagsToMuxer b.SaveAction = Sub(val) p.AddTagsToMuxer = val ' ---------------------------------------------------------------- ui.CreateFlowPage("Thumbnails", True) b = ui.AddBool() b.Text = "Create a thumbnail sheet automatically after encoding" b.Field = NameOf(p.Thumbnailer) Dim thumbsImageFormat = ui.AddMenu(Of String) Dim thumbsQuality = ui.AddNum() thumbsImageFormat.Text = "Image Format" thumbsImageFormat.Expanded = True thumbsImageFormat.Add("BITMAP", "bmp") thumbsImageFormat.Add("GIF", "gif") thumbsImageFormat.Add("JPEG", "jpg") thumbsImageFormat.Add("PNG", "png") thumbsImageFormat.Add("TIFF", "tif") thumbsImageFormat.Button.Value = p.ThumbnailerSettings.GetString("ImageFileFormat", "jpg") thumbsImageFormat.Button.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("ImageFileFormat", value) thumbsImageFormat.Button.ValueChangedAction = Sub(value) thumbsQuality.Visible = value = "jpg" End Sub thumbsQuality.Text = "Quality (%):" thumbsQuality.Config = {1, 100, 1} thumbsQuality.NumEdit.Value = p.ThumbnailerSettings.GetInt("ImageQuality", 70) thumbsQuality.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("ImageQuality", CInt(value)) Dim thumbsHeaderBackColor As SimpleUI.ColorPickerBlock = Nothing Dim thumbsImageBackColor = ui.AddColorPicker() thumbsImageBackColor.Text = "Background Color:" thumbsImageBackColor.Expanded = True thumbsImageBackColor.Color = p.ThumbnailerSettings.GetString("ImageBackColor", New ColorHSL(0, 0, 0.05, 1).ToHTML()).ToColor() thumbsImageBackColor.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("ImageBackColor", ColorTranslator.ToHtml(value)) thumbsImageBackColor.ValueChangedAction = Sub(value) If thumbsHeaderBackColor IsNot Nothing Then thumbsHeaderBackColor.Color = value n = ui.AddNum() n.Text = "Spacer (%):" n.Config = {0, 1000, 1} n.NumEdit.Value = p.ThumbnailerSettings.GetInt("SpacerPercent", 20) n.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("SpacerPercent", CInt(value)) ui.AddLabel(n, " between thumbs, header and sides") ' ---------------------------------------------------------------- ui.CreateFlowPage("Thumbnails | Header", True) b = ui.AddBool() b.Text = "Draw Header" b.Checked = p.ThumbnailerSettings.GetBool("Header", True) b.SaveAction = Sub(value) p.ThumbnailerSettings.SetBool("Header", value) Dim headerFont = ui.AddTextButton() headerFont.Text = "Font Name:" headerFont.Expanded = True headerFont.Edit.Text = p.ThumbnailerSettings.GetString("HeaderFontName", FontManager.GetThumbnailFont().Name) headerFont.Edit.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("HeaderFontName", value) headerFont.ClickAction = Sub() Using td As New TaskDialog(Of FontFamily) td.Title = "Choose a font for the header" td.Symbol = Symbol.Font For Each ff In FontManager.GetFontFamilies(FontCategory.Thumbnail, True) td.AddCommand(ff.Name, ff) Next If td.Show IsNot Nothing Then headerFont.Edit.Text = td.SelectedText End If End Using End Sub Dim cp = ui.AddColorPicker() cp.Text = "Font Color:" cp.Expanded = True cp.Color = p.ThumbnailerSettings.GetString("HeaderFontColor", New ColorHSL(0, 0, 0.8, 1).ToHTML()).ToColor() cp.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("HeaderFontColor", ColorTranslator.ToHtml(value)) n = ui.AddNum() n.Text = "Font Size (%):" n.Config = {10, 1000, 1} n.NumEdit.Value = p.ThumbnailerSettings.GetInt("HeaderFontSizePercent", 100) n.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("HeaderFontSizePercent", CInt(value)) thumbsHeaderBackColor = ui.AddColorPicker() thumbsHeaderBackColor.Text = "Background Color:" thumbsHeaderBackColor.Expanded = True thumbsHeaderBackColor.Color = p.ThumbnailerSettings.GetString("HeaderBackColor", ColorTranslator.ToHtml(thumbsImageBackColor.Color)).ToColor() thumbsHeaderBackColor.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("HeaderBackColor", ColorTranslator.ToHtml(value)) n = ui.AddNum() n.Text = "Separator Size (%):" n.Config = {0, 1000, 2} n.NumEdit.Value = p.ThumbnailerSettings.GetInt("HeaderSeparatorHeightPercent", 0) n.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("HeaderSeparatorHeightPercent", CInt(value)) ' ---------------------------------------------------------------- ui.CreateFlowPage("Thumbnails | Thumbs", True) Dim thumbstimestampAlign = ui.AddMenu(Of ContentAlignment) thumbstimestampAlign.Text = "Timestamp Alignment:" thumbstimestampAlign.Expanded = True thumbstimestampAlign.Button.Value = DirectCast([Enum].Parse(GetType(ContentAlignment), p.ThumbnailerSettings.GetString("TimestampAlignment", ContentAlignment.BottomLeft.ToString()).ToString()), ContentAlignment) thumbstimestampAlign.Button.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("TimestampAlignment", value.ToString()) Dim timestampFont = ui.AddTextButton() timestampFont.Text = "Timestamp Font Name:" timestampFont.Expanded = True timestampFont.Edit.Text = p.ThumbnailerSettings.GetString("TimestampFontName", FontManager.GetThumbnailFont().Name) timestampFont.Edit.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("TimestampFontName", value) timestampFont.ClickAction = Sub() Using td As New TaskDialog(Of FontFamily) td.Title = "Choose a font for the timestamps" td.Symbol = Symbol.Font For Each ff In FontManager.GetFontFamilies(FontCategory.Thumbnail, True) td.AddCommand(ff.Name, ff) Next If td.Show IsNot Nothing Then timestampFont.Edit.Text = td.SelectedText End If End Using End Sub cp = ui.AddColorPicker() cp.Text = "Timestamp Font Color:" cp.Expanded = True cp.Color = p.ThumbnailerSettings.GetString("TimestampFontColor", New ColorHSL(0, 0, 0.9, 1).ToHTML()).ToColor() cp.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("TimestampFontColor", ColorTranslator.ToHtml(value)) n = ui.AddNum() n.Text = "Timestamp Font Size (%):" n.Config = {10, 1000, 1} n.NumEdit.Value = p.ThumbnailerSettings.GetInt("TimestampFontSizePercent", 100) n.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("TimestampFontSizePercent", CInt(value)) cp = ui.AddColorPicker() cp.Text = "Timestamp Outline Color:" cp.Expanded = True cp.Color = p.ThumbnailerSettings.GetString("TimestampOutlineColor", New ColorHSL(0, 0, 0.1, 1).ToHTML()).ToColor() cp.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("TimestampOutlineColor", ColorTranslator.ToHtml(value)) n = ui.AddNum() n.Text = "Timestamp Outline Strength (%):" n.Config = {0, 1000, 2} n.NumEdit.Value = p.ThumbnailerSettings.GetInt("TimestampOutlineStrengthPercent", 100) n.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("TimestampOutlineStrengthPercent", CInt(value)) Dim thumbsMode = ui.AddMenu(Of ThumbnailerRowMode) Dim thumbsColumns = ui.AddNum() Dim thumbsRows = ui.AddNum() Dim thumbsInterval = ui.AddNum() thumbsMode.Text = "Mode to set number of rows:" thumbsMode.Expanded = True thumbsMode.Button.Value = DirectCast([Enum].Parse(GetType(ThumbnailerRowMode), p.ThumbnailerSettings.GetInt("RowMode", ThumbnailerRowMode.Fixed).ToString()), ThumbnailerRowMode) thumbsMode.Button.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("RowMode", value) thumbsMode.Button.ValueChangedAction = Sub(value) thumbsRows.Visible = value = ThumbnailerRowMode.Fixed thumbsInterval.Visible = value = ThumbnailerRowMode.TimeInterval End Sub thumbsColumns.Text = "Columns:" thumbsColumns.Config = {1, 50, 1} thumbsColumns.NumEdit.Value = p.ThumbnailerSettings.GetInt("Columns", 4) thumbsColumns.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("Columns", CInt(value)) thumbsRows.Text = "Rows:" thumbsRows.Visible = thumbsMode.Button.Value = ThumbnailerRowMode.Fixed thumbsRows.Config = {1, 80, 1} thumbsRows.NumEdit.Value = p.ThumbnailerSettings.GetInt("Rows", 6) thumbsRows.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("Rows", CInt(value)) thumbsInterval.Text = "Interval (s):" thumbsInterval.Visible = thumbsMode.Button.Value = ThumbnailerRowMode.TimeInterval thumbsInterval.Config = {1, 1800, 1} thumbsInterval.NumEdit.Value = p.ThumbnailerSettings.GetInt("Interval", 60) thumbsInterval.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("Interval", CInt(value)) n = ui.AddNum() n.Text = "Width of each thumb (px):" n.Config = {0, 1920, 10} n.NumEdit.Value = p.ThumbnailerSettings.GetInt("ThumbWidth", 600) n.NumEdit.SaveAction = Sub(value) p.ThumbnailerSettings.SetInt("ThumbWidth", CInt(value)) ' ---------------------------------------------------------------- Dim pathPage = ui.CreateFlowPage("Paths") l = ui.AddLabel(pathPage, "Default Target Folder:") l.Help = "Leave empty to use the source file folder." Dim macroAction = Sub() MacrosForm.ShowDialogForm() End Sub Dim tm = ui.AddTextMenu(pathPage) tm.Label.Visible = False tm.Edit.Expand = True tm.Edit.Text = p.DefaultTargetFolder tm.Edit.SaveAction = Sub(value) p.DefaultTargetFolder = value tm.AddMenu("Browse Folder...", Function() g.BrowseFolder(p.DefaultTargetFolder)) tm.AddMenu("Directory of source file", "%source_dir%") tm.AddMenu("Parent directory of source file directory", "%source_dir_parent%") tm.AddMenu("Macros...", macroAction) l = ui.AddLabel(pathPage, "Default Target Name:") l.Help = "Leave empty to use the source filename" l.MarginTop = Font.Height tm = ui.AddTextMenu(pathPage) tm.Label.Visible = False tm.Edit.Expand = True tm.Edit.Text = p.DefaultTargetName tm.Edit.SaveAction = Sub(value) p.DefaultTargetName = value tm.AddMenu("Name of source file without extension", "%source_name%") tm.AddMenu("Name of source file directory", "%source_dir_name%") tm.AddMenu("Macros...", macroAction) l = ui.AddLabel(pathPage, If(p.DeleteTempFilesMode = DeleteMode.Disabled, "Temp Files Folder:", $"Temp Files Folder: (MUST end with '_temp{Path.DirectorySeparatorChar}' for Auto-Deletion!)")) l.Help = "Leave empty to use the source file folder." l.MarginTop = Font.Height Dim tempDirFunc = Function() Dim tempDir = g.BrowseFolder(p.TempDir) If tempDir <> "" Then Return Path.Combine(tempDir, "%source_name%_temp") End If End Function tm = ui.AddTextMenu(pathPage) tm.Label.Visible = False tm.Edit.Expand = True tm.Edit.Text = p.TempDir tm.Edit.SaveAction = Sub(value) p.TempDir = value tm.AddMenu("Browse Folder...", tempDirFunc) tm.AddMenu("Source File Directory", $"%source_dir%{Path.DirectorySeparatorChar}%source_name%_temp") tm.AddMenu("Macros...", macroAction) l = ui.AddLabel(pathPage, "Default Thumbnails Path without extension:") l.Help = "Leave empty to save it next to the video file" l.MarginTop = Font.Height tm = ui.AddTextMenu(pathPage) tm.Label.Visible = False tm.Edit.Expand = True tm.Edit.Text = p.ThumbnailerSettings.GetString("ImageFilePathWithoutExtension", "") tm.Edit.SaveAction = Sub(value) p.ThumbnailerSettings.SetString("ImageFilePathWithoutExtension", value) tm.AddMenu("Path of target file without extension + Postfix", $"%target_dir%{Path.DirectorySeparatorChar}%target_name%_Thumbnail") tm.AddMenu("Path of target file without extension", $"%target_dir%{Path.DirectorySeparatorChar}%target_name%") tm.AddMenu("Macros...", macroAction) ' ---------------------------------------------------------------- Dim systemTempFilesPage = ui.CreateFlowPage("Paths | Temp Files", True) Dim deleteModeMenu = ui.AddMenu(Of DeleteMode) Dim deleteSelectionMenu = ui.AddMenu(Of DeleteSelection) Dim deleteSelectionModeMenu = ui.AddMenu(Of SelectionMode) eb = ui.AddEmptyBlock(systemTempFilesPage) eb.Margin = New Padding(0, 6, 0, 3) eb.Visible = p.DeleteTempFilesMode <> DeleteMode.Disabled ui.AddLabel(eb, "Allowed on Frame Mismatch:", 7) ui.AddLabel(eb, "Too less:", 2) Dim deleteOnFrameMismatchNegative = ui.AddNumeric(eb) ui.AddLabel(eb, " ", 1) ui.AddLabel(eb, "Too much:", 2) Dim deleteOnFrameMismatchPositive = ui.AddNumeric(eb) Dim deleteCustomLabel = ui.AddLabel("Custom file extensions (space separated):") Dim deleteCustom = ui.AddTextMenu() Dim deleteSelectiveLabelExcludeText = "Select what shall be excluded:" Dim deleteSelectiveLabelIncludeText = "Select what shall be included:" Dim deleteSelectiveLabel = ui.AddLabel(If(p.DeleteTempFilesSelectionMode = SelectionMode.Exclude, deleteSelectiveLabelExcludeText, deleteSelectiveLabelIncludeText)) Dim deleteSelectiveProjects = ui.AddBool() Dim deleteSelectiveLogs = ui.AddBool() Dim deleteSelectiveScripts = ui.AddBool() Dim deleteSelectiveIndexes = ui.AddBool() Dim deleteSelectiveVideos = ui.AddBool() Dim deleteSelectiveAudios = ui.AddBool() Dim deleteSelectiveSubtitles = ui.AddBool() deleteModeMenu.Text = "Deletion after successful processing:" deleteModeMenu.Expanded = True deleteModeMenu.Field = NameOf(p.DeleteTempFilesMode) deleteModeMenu.Button.ValueChangedAction = Sub(value) Dim deleteModeActive = value <> DeleteMode.Disabled deleteSelectionMenu.Visible = deleteModeActive deleteSelectionMenu.Button.ValueChangedAction.Invoke(deleteSelectionMenu.Button.Value) eb.Visible = deleteModeActive End Sub deleteSelectionMenu.Text = "Selection:" deleteSelectionMenu.Expanded = True deleteSelectionMenu.Field = NameOf(p.DeleteTempFilesSelection) deleteSelectionMenu.Visible = p.DeleteTempFilesMode <> DeleteMode.Disabled deleteSelectionMenu.Button.ValueChangedAction = Sub(value) Dim activeCustom = deleteSelectionMenu.Visible AndAlso value = DeleteSelection.Custom Dim activeSelective = deleteSelectionMenu.Visible AndAlso value = DeleteSelection.Selective deleteSelectionModeMenu.Visible = activeCustom OrElse activeSelective deleteCustomLabel.Visible = activeCustom deleteCustom.Visible = activeCustom deleteSelectiveLabel.Visible = activeSelective deleteSelectiveProjects.Visible = activeSelective deleteSelectiveLogs.Visible = activeSelective deleteSelectiveScripts.Visible = activeSelective deleteSelectiveIndexes.Visible = activeSelective deleteSelectiveVideos.Visible = activeSelective deleteSelectiveAudios.Visible = activeSelective deleteSelectiveSubtitles.Visible = activeSelective End Sub deleteSelectionModeMenu.Text = "Selection Mode:" deleteSelectionModeMenu.Expanded = True deleteSelectionModeMenu.Visible = p.DeleteTempFilesMode <> DeleteMode.Disabled AndAlso p.DeleteTempFilesSelection <> DeleteSelection.Everything deleteSelectionModeMenu.Field = NameOf(p.DeleteTempFilesSelectionMode) deleteSelectionModeMenu.Button.ValueChangedAction = Sub(value) deleteSelectiveLabel.Text = If(value = SelectionMode.Exclude, deleteSelectiveLabelExcludeText, deleteSelectiveLabelIncludeText) If value = SelectionMode.Exclude Then MsgWarn("Be aware!", "Every not selected, listed or identified file type will be deleted!") End If End Sub deleteOnFrameMismatchNegative.Help = "Number of frames that the target file may have too less in order to delete the temp files. (-1 disables the check)" deleteOnFrameMismatchNegative.Config = {-1, 999, 1, 0} deleteOnFrameMismatchNegative.Field = NameOf(p.DeleteTempFilesOnFrameMismatchNegative) deleteOnFrameMismatchPositive.Help = "Number of frames that the target file may have too much in order to delete the temp files. (-1 disables the check)" deleteOnFrameMismatchPositive.Config = {-1, 999, 1, 0} deleteOnFrameMismatchPositive.Field = NameOf(p.DeleteTempFilesOnFrameMismatchPositive) deleteCustomLabel.MarginTop = Font.Height \ 2 deleteCustomLabel.Visible = p.DeleteTempFilesMode <> DeleteMode.Disabled AndAlso p.DeleteTempFilesSelection = DeleteSelection.Custom Dim customAddFunc = Function(extensions As String()) As String Dim exts = deleteCustom.Edit.Text.ToLower().SplitNoEmpty(BR, " ") Dim allExts = exts.Union(extensions) Return allExts.Distinct().Sort().Join(" ") End Function deleteCustom.Visible = p.DeleteTempFilesMode <> DeleteMode.Disabled AndAlso p.DeleteTempFilesSelection = DeleteSelection.Custom deleteCustom.Label.Visible = False deleteCustom.Edit.MultilineHeightFactor = 8 deleteCustom.Edit.Expand = True deleteCustom.Edit.Text = p.DeleteTempFilesCustomSelection.Join(" ") deleteCustom.Edit.SaveAction = Sub(value) p.DeleteTempFilesCustomSelection = value.ToLower().SplitNoEmpty(BR, " ") deleteCustom.AddMenu("Add project file types", Function() customAddFunc(FileTypes.Projects)) deleteCustom.AddMenu("Add log file types", Function() customAddFunc(FileTypes.Logs)) deleteCustom.AddMenu("Add script file types", Function() customAddFunc(FileTypes.Scripts)) deleteCustom.AddMenu("Add index file types", Function() customAddFunc(FileTypes.Indexes)) deleteCustom.AddMenu("Add video file types", Function() customAddFunc(FileTypes.Video)) deleteCustom.AddMenu("Add audio file types", Function() customAddFunc(FileTypes.Audio)) deleteCustom.AddMenu("Add subtitle file types", Function() customAddFunc(FileTypes.SubtitleExludingContainers)) Dim selectiveVisible = p.DeleteTempFilesMode <> DeleteMode.Disabled AndAlso p.DeleteTempFilesSelection = DeleteSelection.Selective deleteSelectiveLabel.MarginTop = Font.Height \ 2 deleteSelectiveLabel.Visible = selectiveVisible deleteSelectiveProjects.Text = "Project files" deleteSelectiveProjects.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Projects) deleteSelectiveProjects.Visible = selectiveVisible deleteSelectiveProjects.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Projects, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Projects) deleteSelectiveLogs.Text = "Log files" deleteSelectiveLogs.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Logs) deleteSelectiveLogs.Visible = selectiveVisible deleteSelectiveLogs.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Logs, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Logs) deleteSelectiveScripts.Text = "Script files" deleteSelectiveScripts.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Scripts) deleteSelectiveScripts.Visible = selectiveVisible deleteSelectiveScripts.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Scripts, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Scripts) deleteSelectiveIndexes.Text = "Index files" deleteSelectiveIndexes.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Indexes) deleteSelectiveIndexes.Visible = selectiveVisible deleteSelectiveIndexes.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Indexes, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Indexes) deleteSelectiveVideos.Text = "Video files" deleteSelectiveVideos.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Videos) deleteSelectiveVideos.Visible = selectiveVisible deleteSelectiveVideos.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Videos, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Videos) deleteSelectiveAudios.Text = "Audio files" deleteSelectiveAudios.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Audios) deleteSelectiveAudios.Visible = selectiveVisible deleteSelectiveAudios.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Audios, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Audios) deleteSelectiveSubtitles.Text = "Subtitles" deleteSelectiveSubtitles.Checked = p.DeleteTempFilesSelectiveSelection.HasFlag(DeleteSelectiveSelection.Subtitles) deleteSelectiveSubtitles.Visible = selectiveVisible deleteSelectiveSubtitles.SaveAction = Sub(value) p.DeleteTempFilesSelectiveSelection = If(value, p.DeleteTempFilesSelectiveSelection Or DeleteSelectiveSelection.Subtitles, p.DeleteTempFilesSelectiveSelection And Not DeleteSelectiveSelection.Subtitles) ' ---------------------------------------------------------------- ui.CreateFlowPage("Assistant") b = ui.AddBool() b.Text = "Remind to crop" b.Field = NameOf(p.RemindToCrop) b = ui.AddBool() b.Text = "Remind to cut" b.Field = NameOf(p.RemindToCut) b = ui.AddBool() b.Text = "Remind to do compressibility check" b.Field = NameOf(p.RemindToDoCompCheck) b = ui.AddBool() b.Text = "Remind to set filters" b.Field = NameOf(p.RemindToSetFilters) b = ui.AddBool() b.Text = "Warn on aspect ratio error" b.Field = NameOf(p.WarnArError) b = ui.AddBool() b.Text = "Warn if no audio in output" b.Field = NameOf(p.WarnNoAudio) b = ui.AddBool() b.Text = "Warn if identical audio is used multiple times" b.Field = NameOf(p.WarnIdenticalAudio) ' ---------------------------------------------------------------- Dim filtersPage = ui.CreateFlowPage("Filters") Dim cb = ui.AddMenu(Of ConvertTo420BitDepth) cb.Text = "Add filter to convert bit depth to" cb.Help = "After a source is loaded, automatically add a filter to convert bit-depth to x-bit" cb.Expanded = True cb.Field = NameOf(p.ConvertToBits) b = ui.AddBool b.Text = "Add filter to convert chroma subsampling to 4:2:0" b.Help = "After a source is loaded, automatically add a filter to convert chroma subsampling to 4:2:0" b.Field = NameOf(p.ConvertChromaSubsampling) b = ui.AddBool b.Text = "Add filter to automatically correct the frame rate." b.Field = NameOf(p.FixFrameRate) b = ui.AddBool b.Text = "Auto-rotate video after loading when possible" b.Help = "Auto-rotate video after loading when the source file/container supports it." b.Field = NameOf(p.AutoRotation) ' ---------------------------------------------------------------- Dim filtersCustomPage = ui.CreateFlowPage("Filters | Custom", True) l = ui.AddLabel(filtersCustomPage, "Code appended to trim functions:") l.Help = "Code appended to trim functions StaxRip generates using the cut feature." l.MarginTop = Font.Height \ 2 t = ui.AddText(filtersCustomPage) t.Label.Visible = False t.Edit.Expand = True t.Edit.TextBox.Multiline = True t.Edit.UseMacroEditor = True t.Edit.Text = p.TrimCode t.Edit.SaveAction = Sub(value) p.TrimCode = value l = ui.AddLabel(filtersCustomPage, "Code inserted at top of scripts:") l.Help = "Code inserted at the top of every script StaxRip generates." l.MarginTop = Font.Height \ 2 t = ui.AddText(filtersCustomPage) t.Label.Visible = False t.Edit.Expand = True t.Edit.TextBox.Multiline = True t.Edit.UseMacroEditor = True t.Edit.Text = p.CodeAtTop t.Edit.SaveAction = Sub(value) p.CodeAtTop = value l = ui.AddLabel(filtersCustomPage, "Code inserted at bottom of scripts:") l.Help = "Code inserted at the bottom of every script StaxRip generates." l.MarginTop = Font.Height \ 2 t = ui.AddText(filtersCustomPage) t.Label.Visible = False t.Edit.Expand = True t.Edit.TextBox.Multiline = True t.Edit.UseMacroEditor = True t.Edit.Text = p.CodeAtBottom t.Edit.SaveAction = Sub(value) p.CodeAtBottom = value ' ---------------------------------------------------------------- Dim miscPage = ui.CreateFlowPage("Misc") miscPage.SuspendLayout() b = ui.AddBool(miscPage) b.Text = "Hide dialogs asking to demux, source filter etc." b.Checked = p.NoDialogs b.SaveAction = Sub(value) p.NoDialogs = value b = ui.AddBool(miscPage) b.Text = "Use source file folder for temp files" b.Checked = p.NoTempDir b.SaveAction = Sub(value) p.NoTempDir = value b = ui.AddBool(miscPage) b.Text = "Abort on Frame Mismatch" b.Field = NameOf(p.AbortOnFrameMismatch) ui.AddLine(miscPage, "Compressibility Check") b = ui.AddBool(miscPage) b.Text = "Auto run compressibility check" b.Help = "Performs a compressibility check after loading a source file." b.Checked = p.AutoCompCheck b.SaveAction = Sub(value) p.AutoCompCheck = value n = ui.AddNum(miscPage) n.Label.Text = "Percentage of length to check" n.NumEdit.Config = {1, 25} n.NumEdit.Value = p.CompCheckPercentage n.NumEdit.SaveAction = Sub(value) p.CompCheckPercentage = value n = ui.AddNum(miscPage) n.Label.Text = "Seconds per test block" n.NumEdit.Config = {0.5, 10.0, 0.1, 2} n.NumEdit.Value = p.CompCheckTestblockSeconds n.NumEdit.SaveAction = Sub(value) p.CompCheckTestblockSeconds = value Dim compCheckButton = ui.AddMenu(Of CompCheckAction)(miscPage) compCheckButton.Label.Text = "After comp. check adjust" compCheckButton.Button.Value = p.CompCheckAction compCheckButton.Button.SaveAction = Sub(value) p.CompCheckAction = value miscPage.ResumeLayout() ' ---------------------------------------------------------------- If pagePath <> "" Then ui.ShowPage(pagePath) Else ui.SelectLast("last options page") End If If form.ShowDialog() = DialogResult.OK Then Dim autoCropModeOn = autoCropMode.Button.Value <> StaxRip.AutoCropMode.Disabled Dim autoCropModeChanged = autoCropMode.Button.Value <> p.AutoCropMode Dim dvDataAvailable = p.HdrDolbyVisionMetadataFile IsNot Nothing Dim cropFilterActive = p.Script.GetFilter("Crop")?.Active Dim cropChanged = leftCrop.Value <> p.CropLeft OrElse topCrop.Value <> p.CropTop OrElse rightCrop.Value <> p.CropRight OrElse bottomCrop.Value <> p.CropBottom Dim dvThresholdChanged = doviThresholdBegin.Value <> p.AutoCropDolbyVisionThresholdBegin OrElse doviThresholdEnd.Value <> p.AutoCropDolbyVisionThresholdEnd ui.Save() If p.CompCheckPercentage < 1 OrElse p.CompCheckPercentage > 25 Then p.CompCheckPercentage = 5 If p.CompCheckTestblockSeconds < 0.5 OrElse p.CompCheckTestblockSeconds > 10.0 Then p.CompCheckTestblockSeconds = 2.0 If autoCropModeOn AndAlso autoCropModeChanged AndAlso dvDataAvailable AndAlso cropFilterActive Then StartAutoCrop() If cropChanged Then p.CropLeft = CInt(leftCrop.Value) p.CropTop = CInt(topCrop.Value) p.CropRight = CInt(rightCrop.Value) p.CropBottom = CInt(bottomCrop.Value) End If UpdateSizeOrBitrate() tbBitrate_TextChanged() SetSlider() SetAudioTracks(p) Assistant() End If ui.SaveLast("last options page") End Using End Sub End Class