mirror of
https://github.com/staxrip/staxrip.git
synced 2026-10-24 18:19:57 +08:00
347 lines
13 KiB
VB.net
347 lines
13 KiB
VB.net
Imports System.Threading
|
|
Imports System.Threading.Tasks
|
|
|
|
Imports StaxRip.CommandLine
|
|
Imports StaxRip.UI
|
|
|
|
Public Class CommandLineForm
|
|
Private Params As CommandLineParams
|
|
|
|
Public HTMLHelp As String
|
|
|
|
Private SearchIndex As Integer
|
|
Private Items As New List(Of Item)
|
|
|
|
Public Sub New(params As CommandLineParams)
|
|
InitializeComponent()
|
|
SimpleUI.ScaleClientSize(37, 25)
|
|
rtbCommandLine.ScrollBars = RichTextBoxScrollBars.None
|
|
Dim singleList As New List(Of String)
|
|
|
|
For Each i In params.Items
|
|
If i.GetKey = "" OrElse singleList.Contains(i.GetKey) Then
|
|
Throw New Exception("key found twice: " + i.GetKey)
|
|
End If
|
|
|
|
singleList.Add(i.GetKey)
|
|
Next
|
|
|
|
Me.Params = params
|
|
Text = params.Title + " (" & params.Items.Count & " options)"
|
|
|
|
InitUI()
|
|
SelectLastPage()
|
|
AddHandler params.ValueChanged, AddressOf ValueChanged
|
|
params.RaiseValueChanged(Nothing)
|
|
|
|
cbGoTo.Sorted = True
|
|
cbGoTo.SendMessageCue("Search")
|
|
cbGoTo.Select()
|
|
|
|
cms.Add("Execute Command Line", Sub() params.Execute(), Nothing, p.SourceFile <> "").SetImage(Symbol.fa_terminal)
|
|
cms.Add("Copy Command Line", Sub() Clipboard.SetText(params.GetCommandLine(True, True)))
|
|
cms.Add("Show Command Line...", Sub() g.ShowCommandLinePreview("Command Line", params.GetCommandLine(True, True)))
|
|
cms.Add("Import Command Line...", Sub() If MsgQuestion("Import command line from clipboard?") = DialogResult.OK Then BasicVideoEncoder.ImportCommandLine(Clipboard.GetText, params))
|
|
|
|
cms.Add("Help", AddressOf ShowHelp).SetImage(Symbol.Help)
|
|
cms.Add(params.GetPackage.Name + " Help", Sub() g.StartProcess(params.GetPackage.GetHelpPath))
|
|
End Sub
|
|
|
|
Sub SelectLastPage()
|
|
SimpleUI.SelectLast(Params.Title + "page selection")
|
|
End Sub
|
|
|
|
Sub ValueChanged(item As CommandLineParam)
|
|
rtbCommandLine.SetText(Params.GetCommandLine(False, False))
|
|
rtbCommandLine.SelectionLength = 0
|
|
rtbCommandLine.UpdateHeight()
|
|
UpdateSearchComboBox()
|
|
End Sub
|
|
|
|
Sub InitUI()
|
|
Dim flowPanels As New List(Of Control)
|
|
Dim helpControl As Control
|
|
Dim currentFlow As SimpleUI.FlowPage
|
|
|
|
For x = 0 To Params.Items.Count - 1
|
|
Dim item = Params.Items(x)
|
|
Dim parent As FlowLayoutPanelEx = SimpleUI.GetFlowPage(item.Path)
|
|
currentFlow = DirectCast(parent, SimpleUI.FlowPage)
|
|
|
|
If Not flowPanels.Contains(parent) Then
|
|
flowPanels.Add(parent)
|
|
parent.SuspendLayout()
|
|
End If
|
|
|
|
Dim help As String = Nothing
|
|
Dim switches = item.Switches
|
|
|
|
If item.Switch <> "" Then help += item.Switch + BR
|
|
If item.NoSwitch <> "" Then help += item.NoSwitch + BR
|
|
If Not switches.NothingOrEmpty Then help += switches.Join(BR) + BR
|
|
|
|
help += BR
|
|
|
|
If TypeOf item Is NumParam Then
|
|
Dim param = DirectCast(item, NumParam)
|
|
If param.Config(0) > Double.MinValue Then help += "Minimum: " & param.Config(0) & BR
|
|
If param.Config(1) < Double.MaxValue Then help += "Maximum: " & param.Config(1) & BR
|
|
End If
|
|
|
|
help += BR
|
|
|
|
If Not item.URLs.NothingOrEmpty Then help += String.Join(BR, item.URLs.Select(Function(val) "[" + val + " " + val + "]"))
|
|
If item.Help <> "" Then help += item.Help
|
|
|
|
If help <> "" Then
|
|
If help.Contains(BR2 + BR) Then help = help.Replace(BR2 + BR, BR2)
|
|
If help.EndsWith(BR) Then help = help.Trim
|
|
End If
|
|
|
|
If item.Label <> "" Then SimpleUI.AddLabel(parent, item.Label).MarginTop = FontHeight \ 2
|
|
|
|
If TypeOf item Is BoolParam Then
|
|
Dim cb = SimpleUI.AddBool(parent)
|
|
cb.Text = item.Text
|
|
|
|
If item.HelpSwitch <> "" Then
|
|
Dim helpID = item.HelpSwitch
|
|
cb.HelpAction = Sub() Params.ShowHelp(helpID)
|
|
Else
|
|
cb.Help = help
|
|
End If
|
|
|
|
cb.MarginLeft = item.LeftMargin
|
|
DirectCast(item, BoolParam).InitParam(cb)
|
|
helpControl = cb
|
|
ElseIf TypeOf item Is NumParam Then
|
|
Dim tempItem = DirectCast(item, NumParam)
|
|
Dim param = DirectCast(item, NumParam)
|
|
Dim nb = SimpleUI.AddNum(parent)
|
|
nb.Label.Text = If(item.Text.EndsWith(":"), item.Text, item.Text + ":")
|
|
|
|
If item.HelpSwitch <> "" Then
|
|
Dim helpID = item.HelpSwitch
|
|
nb.Label.HelpAction = Sub() Params.ShowHelp(helpID)
|
|
Else
|
|
nb.Label.Help = help
|
|
End If
|
|
|
|
nb.NumEdit.Config = param.Config
|
|
AddHandler nb.Label.MouseDoubleClick, Sub() tempItem.Value = tempItem.DefaultValue
|
|
DirectCast(item, NumParam).InitParam(nb.NumEdit)
|
|
helpControl = nb.Label
|
|
ElseIf TypeOf item Is OptionParam Then
|
|
Dim tempItem = DirectCast(item, OptionParam)
|
|
Dim os = DirectCast(item, OptionParam)
|
|
Dim mb = SimpleUI.AddMenu(Of Integer)(parent)
|
|
mb.Label.Text = If(item.Text.EndsWith(":"), item.Text, item.Text + ":")
|
|
|
|
If item.HelpSwitch <> "" Then
|
|
Dim helpID = item.HelpSwitch
|
|
mb.Label.HelpAction = Sub() Params.ShowHelp(helpID)
|
|
mb.Button.HelpAction = Sub() Params.ShowHelp(helpID)
|
|
Else
|
|
mb.Help = help
|
|
End If
|
|
|
|
helpControl = mb.Label
|
|
AddHandler mb.Label.MouseDoubleClick, Sub() tempItem.ValueChangedUser(tempItem.DefaultValue)
|
|
If os.Expand Then mb.Button.Expand = True
|
|
|
|
For x2 = 0 To os.Options.Length - 1
|
|
mb.Button.Add(os.Options(x2), x2)
|
|
Next
|
|
|
|
os.Init2(mb.Button)
|
|
ElseIf TypeOf item Is StringParam Then
|
|
Dim tempItem = DirectCast(item, StringParam)
|
|
Dim textBlock As SimpleUI.TextBlock
|
|
|
|
If tempItem.BrowseFileFilter <> "" Then
|
|
Dim textButtonBlock = SimpleUI.AddTextButton(parent)
|
|
textButtonBlock.BrowseFile(tempItem.BrowseFileFilter)
|
|
textBlock = textButtonBlock
|
|
ElseIf tempItem.Menu <> "" Then
|
|
Dim textMenuBlock = SimpleUI.AddTextMenu(parent)
|
|
textMenuBlock.AddMenu(tempItem.Menu)
|
|
textBlock = textMenuBlock
|
|
Else
|
|
textBlock = SimpleUI.AddText(parent)
|
|
End If
|
|
|
|
textBlock.Label.Text = If(item.Text.EndsWith(":"), item.Text, item.Text + ":")
|
|
|
|
If item.HelpSwitch <> "" Then
|
|
Dim helpID = item.HelpSwitch
|
|
textBlock.Label.HelpAction = Sub() Params.ShowHelp(helpID)
|
|
Else
|
|
textBlock.Label.Help = help
|
|
End If
|
|
|
|
helpControl = textBlock.Label
|
|
AddHandler textBlock.Label.MouseDoubleClick, Sub() tempItem.Value = tempItem.DefaultValue
|
|
textBlock.Edit.Expand = tempItem.Expand
|
|
tempItem.Init(textBlock)
|
|
End If
|
|
|
|
If Not helpControl Is Nothing Then
|
|
Dim item2 As New Item
|
|
item2.Control = helpControl
|
|
item2.Page = currentFlow
|
|
item2.Param = item
|
|
Items.Add(item2)
|
|
End If
|
|
Next
|
|
|
|
For Each i In flowPanels
|
|
i.ResumeLayout()
|
|
Next
|
|
End Sub
|
|
|
|
Public Class Item
|
|
Property Page As SimpleUI.FlowPage
|
|
Property Control As Control
|
|
Property Param As CommandLineParam
|
|
End Class
|
|
|
|
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
|
|
SimpleUI.SaveLast(Params.Title + "page selection")
|
|
RemoveHandler Params.ValueChanged, AddressOf ValueChanged
|
|
MyBase.OnFormClosed(e)
|
|
End Sub
|
|
|
|
Private Sub CommandLineForm_HelpRequested(sender As Object, hlpevent As HelpEventArgs) Handles Me.HelpRequested
|
|
ShowHelp()
|
|
End Sub
|
|
|
|
Sub ShowHelp()
|
|
Dim f As New HelpForm()
|
|
f.Doc.WriteStart(Text)
|
|
If cbGoTo.Visible Then f.Doc.WriteP("The Search input field can be used to search for options, it searches the switch and the label. Multiple matches can be cycled by pressing enter.")
|
|
f.Doc.WriteP("Numeric values and options can be reset to their default value by double clicking on the label.")
|
|
f.Doc.WriteP("The context help is shown with a right-click on a label, menu or checkbox.")
|
|
If HTMLHelp <> "" Then f.Doc.Writer.WriteRaw(HTMLHelp)
|
|
f.Doc.WriteTips(SimpleUI.ActivePage.TipProvider.GetTips)
|
|
f.Show()
|
|
End Sub
|
|
|
|
Private Sub cbGoTo_KeyDown(sender As Object, e As KeyEventArgs) Handles cbGoTo.KeyDown
|
|
If e.KeyData = Keys.Enter Then
|
|
SearchIndex += 1
|
|
cbGoTo_TextChanged(Nothing, Nothing)
|
|
Else
|
|
SearchIndex = 0
|
|
End If
|
|
|
|
If e.KeyData = Keys.Enter Then e.SuppressKeyPress = True
|
|
End Sub
|
|
|
|
Private Sub cbGoTo_TextChanged(sender As Object, e As EventArgs) Handles cbGoTo.TextChanged
|
|
Dim find = cbGoTo.Text.ToLower
|
|
Dim matchedItems As New HashSet(Of Item)
|
|
|
|
If find.Length > 1 Then
|
|
For Each item In Items
|
|
If item.Param.NoSwitch?.ToLower?.Contains(find) Then matchedItems.Add(item)
|
|
If item.Param.Switch?.ToLower?.Contains(find) Then matchedItems.Add(item)
|
|
If item.Param.Help?.ToLower?.Contains(find) Then matchedItems.Add(item)
|
|
If item.Param.Text?.ToLower?.Contains(find) Then matchedItems.Add(item)
|
|
|
|
If Not item.Param.Switches Is Nothing Then
|
|
For Each switch In item.Param.Switches
|
|
If switch.ToLower.Contains(find) Then matchedItems.Add(item)
|
|
Next
|
|
End If
|
|
Next
|
|
|
|
Dim visibleItems = matchedItems.Where(Function(arg) arg.Param.Visible)
|
|
|
|
If visibleItems.Count > 0 Then
|
|
If SearchIndex >= visibleItems.Count Then SearchIndex = 0
|
|
Dim control = visibleItems(SearchIndex).Control
|
|
SimpleUI.ShowPage(visibleItems(SearchIndex).Page)
|
|
Highlight(control)
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Sub Highlight(c As Control)
|
|
Task.Run(Sub() HighlightAsync(c))
|
|
End Sub
|
|
|
|
Private BlockHighlight As Boolean
|
|
Private EarlyExit As Boolean
|
|
|
|
Sub HighlightAsync(c As Control)
|
|
While BlockHighlight
|
|
EarlyExit = True
|
|
Thread.Sleep(1)
|
|
End While
|
|
|
|
EarlyExit = False
|
|
BlockHighlight = True
|
|
|
|
Try
|
|
Dim size As Double = 9
|
|
|
|
For x = 0 To 30
|
|
If EarlyExit Then Exit For
|
|
Thread.Sleep(1)
|
|
size += 0.1
|
|
Dim tempSize = size
|
|
Invoke(Sub()
|
|
c.Font = New Font(c.Font.FontFamily, CSng(tempSize * s.UIScaleFactor), FontStyle.Bold)
|
|
c.ForeColor = ControlPaint.Dark(ToolStripRendererEx.ColorBorder, 0.1)
|
|
End Sub)
|
|
Next
|
|
|
|
For x = 0 To 30
|
|
If EarlyExit Then Exit For
|
|
Thread.Sleep(1)
|
|
size -= 0.1
|
|
Dim tempSize = size
|
|
Invoke(Sub()
|
|
c.Font = New Font(c.Font.FontFamily, CSng(tempSize * s.UIScaleFactor), FontStyle.Bold)
|
|
c.ForeColor = ControlPaint.Dark(ToolStripRendererEx.ColorBorder, 0.1)
|
|
End Sub)
|
|
Next
|
|
Finally
|
|
Try
|
|
Invoke(Sub()
|
|
c.Font = New Font(c.Font.FontFamily, 9 * s.UIScaleFactor, FontStyle.Regular)
|
|
c.ForeColor = Color.Black
|
|
End Sub)
|
|
Catch
|
|
End Try
|
|
End Try
|
|
|
|
BlockHighlight = False
|
|
End Sub
|
|
|
|
Sub UpdateSearchComboBox()
|
|
cbGoTo.Items.Clear()
|
|
|
|
For Each i In Items
|
|
If i.Param.Visible Then
|
|
If Not i.Param.Switches Is Nothing Then
|
|
For Each switch In i.Param.Switches
|
|
If Not cbGoTo.Items.Contains(switch) Then cbGoTo.Items.Add(switch)
|
|
Next
|
|
End If
|
|
|
|
If i.Param.Switch <> "" AndAlso Not cbGoTo.Items.Contains(i.Param.Switch) Then
|
|
cbGoTo.Items.Add(i.Param.Switch)
|
|
End If
|
|
|
|
If i.Param.NoSwitch <> "" AndAlso Not cbGoTo.Items.Contains(i.Param.NoSwitch) Then
|
|
cbGoTo.Items.Add(i.Param.NoSwitch)
|
|
End If
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
Private Sub CommandLineForm_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
|
|
g.MainForm.PopulateProfileMenu(DynamicMenuItemID.EncoderProfiles)
|
|
End Sub
|
|
End Class |