PageSelectLeft.xaml.vb 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. Public Class PageSelectLeft
  2. Private Sub PageSelectLeft_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
  3. AddHandler McFolderListLoader.PreviewFinish, Sub() If FrmSelectLeft IsNot Nothing Then RunInUiWait(AddressOf McFolderListUI)
  4. End Sub
  5. Private IsFirstLoad As Boolean = True
  6. Private Sub PageSelectLeft_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  7. If IsFirstLoad Then McFolderListUI() '若已经执行完成,触发首次加载
  8. IsFirstLoad = False
  9. End Sub
  10. Private Sub McFolderListUI()
  11. Try
  12. '确认数据有变化
  13. If McFolderListLast IsNot Nothing AndAlso McFolderListLast.SequenceEqual(McFolderList) Then
  14. Dim IsEqual As Boolean = True
  15. For i = 0 To McFolderListLast.Count - 1
  16. If Not McFolderListLast(i).Equals(McFolderList(i)) Then
  17. IsEqual = False
  18. Exit For
  19. End If
  20. Next
  21. If IsEqual Then Exit Sub
  22. End If
  23. McFolderListLast = McFolderList
  24. '创建 UI
  25. FrmSelectLeft.PanList.Children.Clear()
  26. '文件夹列表
  27. FrmSelectLeft.PanList.Children.Add(New TextBlock With {.Text = "文件夹列表", .Margin = New Thickness(13, 18, 5, 4), .Opacity = 0.6, .FontSize = 12})
  28. For Each Folder As McFolder In McFolderList.ToArray
  29. '添加控件
  30. Dim ContMenu As ContextMenu = Nothing
  31. Select Case Folder.Type
  32. Case McFolderType.Original
  33. ContMenu = GetObjectFromXML(
  34. <ContextMenu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL;assembly=Plain Craft Launcher 2">
  35. <local:MyMenuItem x:Name="Rename" Header="重命名" Padding="0,2,0,0" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
  36. <local:MyMenuItem x:Name="Open" Header="打开" Icon="F1 M 19,50L 28,34L 63,34L 54,50L 19,50 Z M 19,28.0001L 35,28C 36,25 37.4999,24.0001 37.4999,24.0001L 48.75,24C 49.3023,24 50,24.6977 50,25.25L 50,28L 54,28.0001L 54,32L 27,32L 19,46.4L 19,28.0001 Z"/>
  37. <local:MyMenuItem x:Name="Refresh" Header="刷新" Icon="F1 M 38,20.5833C 42.9908,20.5833 47.4912,22.6825 50.6667,26.046L 50.6667,17.4167L 55.4166,22.1667L 55.4167,34.8333L 42.75,34.8333L 38,30.0833L 46.8512,30.0833C 44.6768,27.6539 41.517,26.125 38,26.125C 31.9785,26.125 27.0037,30.6068 26.2296,36.4167L 20.6543,36.4167C 21.4543,27.5397 28.9148,20.5833 38,20.5833 Z M 38,49.875C 44.0215,49.875 48.9963,45.3932 49.7703,39.5833L 55.3457,39.5833C 54.5457,48.4603 47.0852,55.4167 38,55.4167C 33.0092,55.4167 28.5088,53.3175 25.3333,49.954L 25.3333,58.5833L 20.5833,53.8333L 20.5833,41.1667L 33.25,41.1667L 38,45.9167L 29.1487,45.9167C 31.3231,48.3461 34.483,49.875 38,49.875 Z"/>
  38. <local:MyMenuItem x:Name="Delete" Header="删除" Padding="0,0,0,2" Icon="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/>
  39. </ContextMenu>
  40. )
  41. Case McFolderType.RenamedOriginal
  42. ContMenu = GetObjectFromXML(
  43. <ContextMenu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL;assembly=Plain Craft Launcher 2">
  44. <local:MyMenuItem x:Name="Remove" Header="复原名称" Padding="0,2,0,0" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
  45. <local:MyMenuItem x:Name="Rename" Header="重命名" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
  46. <local:MyMenuItem x:Name="Open" Header="打开" Icon="F1 M 19,50L 28,34L 63,34L 54,50L 19,50 Z M 19,28.0001L 35,28C 36,25 37.4999,24.0001 37.4999,24.0001L 48.75,24C 49.3023,24 50,24.6977 50,25.25L 50,28L 54,28.0001L 54,32L 27,32L 19,46.4L 19,28.0001 Z"/>
  47. <local:MyMenuItem x:Name="Refresh" Header="刷新" Icon="F1 M 38,20.5833C 42.9908,20.5833 47.4912,22.6825 50.6667,26.046L 50.6667,17.4167L 55.4166,22.1667L 55.4167,34.8333L 42.75,34.8333L 38,30.0833L 46.8512,30.0833C 44.6768,27.6539 41.517,26.125 38,26.125C 31.9785,26.125 27.0037,30.6068 26.2296,36.4167L 20.6543,36.4167C 21.4543,27.5397 28.9148,20.5833 38,20.5833 Z M 38,49.875C 44.0215,49.875 48.9963,45.3932 49.7703,39.5833L 55.3457,39.5833C 54.5457,48.4603 47.0852,55.4167 38,55.4167C 33.0092,55.4167 28.5088,53.3175 25.3333,49.954L 25.3333,58.5833L 20.5833,53.8333L 20.5833,41.1667L 33.25,41.1667L 38,45.9167L 29.1487,45.9167C 31.3231,48.3461 34.483,49.875 38,49.875 Z"/>
  48. <local:MyMenuItem x:Name="Delete" Header="删除" Padding="0,0,0,2" Icon="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/>
  49. </ContextMenu>
  50. )
  51. Case McFolderType.Custom
  52. ContMenu = GetObjectFromXML(
  53. <ContextMenu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL;assembly=Plain Craft Launcher 2">
  54. <local:MyMenuItem x:Name="Rename" Header="重命名" Padding="0,2,0,0" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
  55. <local:MyMenuItem x:Name="Open" Header="打开" Icon="F1 M 19,50L 28,34L 63,34L 54,50L 19,50 Z M 19,28.0001L 35,28C 36,25 37.4999,24.0001 37.4999,24.0001L 48.75,24C 49.3023,24 50,24.6977 50,25.25L 50,28L 54,28.0001L 54,32L 27,32L 19,46.4L 19,28.0001 Z"/>
  56. <local:MyMenuItem x:Name="Refresh" Header="刷新" Icon="F1 M 38,20.5833C 42.9908,20.5833 47.4912,22.6825 50.6667,26.046L 50.6667,17.4167L 55.4166,22.1667L 55.4167,34.8333L 42.75,34.8333L 38,30.0833L 46.8512,30.0833C 44.6768,27.6539 41.517,26.125 38,26.125C 31.9785,26.125 27.0037,30.6068 26.2296,36.4167L 20.6543,36.4167C 21.4543,27.5397 28.9148,20.5833 38,20.5833 Z M 38,49.875C 44.0215,49.875 48.9963,45.3932 49.7703,39.5833L 55.3457,39.5833C 54.5457,48.4603 47.0852,55.4167 38,55.4167C 33.0092,55.4167 28.5088,53.3175 25.3333,49.954L 25.3333,58.5833L 20.5833,53.8333L 20.5833,41.1667L 33.25,41.1667L 38,45.9167L 29.1487,45.9167C 31.3231,48.3461 34.483,49.875 38,49.875 Z"/>
  57. <local:MyMenuItem x:Name="Remove" Header="移出列表" Icon="F1 M 23.3428,25.205L 23.3805,25.4461C 23.9229,27.177 30.261,29.0992 38,29.0992C 45.7386,29.0992 52.0765,27.1771 52.6194,25.4463L 52.6571,25.205C 52.6571,23.3616 46.0949,21.3109 38,21.3109C 29.9051,21.3109 23.3428,23.3616 23.3428,25.205 Z M 23.3428,53.0204L 19.1571,26.2111C 19.0534,25.8817 19,25.5459 19,25.205C 19,20.9036 27.5066,17.4167 38,17.4167C 48.4934,17.4167 57,20.9036 57,25.205C 57,25.5459 56.9466,25.8818 56.8429,26.2112L 52.6571,53.0204L 52.5974,53.0204C 51.9241,56.1393 45.6457,58.5833 38,58.5833C 30.3543,58.5833 24.076,56.1393 23.4026,53.0204L 23.3428,53.0204 Z M 51.8228,30.5485C 48.3585,32.0537 43.4469,32.9933 38,32.9933C 32.5531,32.9933 27.6415,32.0537 24.1771,30.5484L 27.5988,52.464L 27.6857,52.464C 27.6857,53.3857 32.3036,54.6892 38,54.6892C 43.6964,54.6892 48.3143,53.3857 48.3143,52.464L 48.4011,52.464L 51.8228,30.5485 Z "/>
  58. <local:MyMenuItem x:Name="Delete" Header="删除" Padding="0,0,0,2" Icon="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/>
  59. </ContextMenu>
  60. )
  61. End Select
  62. If (Folder.Type = McFolderType.Original OrElse Folder.Type = McFolderType.RenamedOriginal) AndAlso Folder.Path = Path & ".minecraft\" AndAlso McFolderList.Count = 1 Then CType(ContMenu.FindName("Delete"), MyMenuItem).Header = "清空"
  63. '注册事件
  64. If Not Folder.Type = McFolderType.Original Then CType(ContMenu.FindName("Remove"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Remove_Click))
  65. CType(ContMenu.FindName("Open"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Open_Click))
  66. CType(ContMenu.FindName("Delete"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Delete_Click))
  67. CType(ContMenu.FindName("Rename"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Rename_Click))
  68. CType(ContMenu.FindName("Refresh"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Refresh_Click))
  69. '构建框架与图表按钮
  70. Dim NewItem As New MyListItem With {.IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.RadioBox, .PaddingRight = 30, .Title = Folder.Name, .Info = Folder.Path, .Height = 40, .ContextMenu = ContMenu, .Tag = Folder}
  71. AddHandler NewItem.Changed, AddressOf FrmSelectLeft.Folder_Change
  72. Dim NewIconButton As New MyIconButton With {.Logo = Logo.IconButtonSetup, .LogoScale = 1.1}
  73. AddHandler NewIconButton.Click, Sub(sender, e)
  74. ContMenu.PlacementTarget = NewItem
  75. ContMenu.IsOpen = True
  76. End Sub
  77. NewItem.Buttons = {NewIconButton}
  78. FrmSelectLeft.PanList.Children.Add(NewItem)
  79. Log("[Minecraft] 有效的 Minecraft 文件夹:" & Folder.Name & " > " & Folder.Path)
  80. Next
  81. '标题文本
  82. FrmSelectLeft.PanList.Children.Add(New TextBlock With {.Text = "添加或导入", .Margin = New Thickness(13, 18, 5, 4), .Opacity = 0.6, .FontSize = 12})
  83. '确认创建按钮状态
  84. If Not Directory.Exists(Path & ".minecraft\") Then
  85. Dim ItemCreate As New MyListItem With {.IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.Clickable, .Title = "新建 .minecraft 文件夹", .Height = 34,
  86. .ToolTip = "在 PCL 当前所在文件夹下创建新的 .minecraft 文件夹",
  87. .LogoScale = 0.9,
  88. .Logo = "M103.331925 384.978025l25.805736 0L129.137661 161.847132c0-18.313088 14.905478-33.718963 33.718963-33.718963l0.969071 0 253.006318 0c10.82044 0 20.218484 4.797259 26.500561 12.257162l117.579929 126.753869 297.819966 0c18.297738 0 33.736359 15.179724 33.736359 33.977859l0 0.952698 0 82.909292 25.547863 0c18.538215 0 34.187637 15.179724 34.187637 33.977859 0 2.163269-0.469698 3.617387-0.469698 5.539156l-54.437843 432.971086c-1.210571 10.382465-7.007601 19.056008-14.968923 24.352641-6.249331 5.765307-14.680351 9.624195-23.595394 9.624195l-0.969071 0-694.906773 0c-9.155521 0-17.344017-3.858888-23.626094-9.155521-8.67252-5.765307-14.453177-14.939247-15.389502-25.758664L69.597613 423.040922c-2.165316-18.313088 10.868535-35.414581 29.665647-38.062897L103.331925 384.978025 103.331925 384.978025zM196.576609 384.978025 196.576609 384.978025l627.938546 0 0-49.625234L546.461371 335.352791l0 0c-9.400091 0-18.329461-4.117784-25.048489-11.110035L402.363486 196.067514 196.576609 196.067514 196.576609 384.978025 196.576609 384.978025zM879.469767 452.916347 879.469767 452.916347l-20.267603 0-0.469698 0-0.969071 0-694.906773 0-0.984421 0-20.218484 0 45.781696 366.728382 646.218888 0L879.469767 452.916347 879.469767 452.916347z"}
  89. ToolTipService.SetPlacement(ItemCreate, Primitives.PlacementMode.Right)
  90. ToolTipService.SetHorizontalOffset(ItemCreate, -50)
  91. ToolTipService.SetVerticalOffset(ItemCreate, 2.5)
  92. ToolTipService.SetShowDuration(ItemCreate, 2333333)
  93. FrmSelectLeft.PanList.Children.Add(ItemCreate)
  94. AddHandler ItemCreate.Click, AddressOf FrmSelectLeft.Create_Click
  95. End If
  96. '添加按钮
  97. Dim ItemAdd As New MyListItem With {.IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.Clickable, .Title = "添加已有文件夹", .Height = 34,
  98. .ToolTip = "将一个已有的 Minecraft 文件夹添加到列表",
  99. .Logo = "M512.277 954.412c-118.89 0-230.659-46.078-314.73-129.73S67.12 629.666 67.12 511.222s46.327-229.744 130.398-313.427 195.82-129.73 314.73-129.73 230.659 46.078 314.72 129.73S957.397 392.81 957.397 511.183 911.078 740.96 826.97 824.642s-195.8 129.77-314.692 129.77z m0-822.784c-101.972 0-197.809 39.494-269.865 111.222s-111.7 166.997-111.7 268.373 39.653 196.695 111.67 268.335S410.246 890.78 512.248 890.78s197.809-39.484 269.865-111.222 111.7-166.998 111.67-268.374c-0.03-101.375-39.654-196.665-111.67-268.303S614.22 131.628 512.277 131.628z m222.585 347.8H544.073V288.64c-0.76-17.561-15.613-31.18-33.173-30.419-16.495 0.714-29.704 13.924-30.419 30.419v190.787H289.703c-17.56 0.761-31.179 15.614-30.419 33.174 0.715 16.494 13.924 29.703 30.42 30.418H480.48v190.788c0.761 17.56 15.614 31.179 33.174 30.419 16.494-0.715 29.703-13.925 30.418-30.42V543.02h190.788c17.56 0.762 32.413-12.857 33.173-30.418 0.762-17.561-12.858-32.414-30.419-33.174a31.683 31.683 0 0 0-2.753 0z"}
  100. ToolTipService.SetPlacement(ItemAdd, Primitives.PlacementMode.Right)
  101. ToolTipService.SetHorizontalOffset(ItemAdd, -50)
  102. ToolTipService.SetVerticalOffset(ItemAdd, 2.5)
  103. ToolTipService.SetShowDuration(ItemAdd, 2333333)
  104. FrmSelectLeft.PanList.Children.Add(ItemAdd)
  105. AddHandler ItemAdd.Click, AddressOf FrmSelectLeft.Add_Click
  106. '安装按钮
  107. Dim ItemInstall As New MyListItem With {.IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.Clickable, .Title = "导入整合包", .Height = 34,
  108. .ToolTip = "在当前选择的 Minecraft 文件夹下安装整合包",
  109. .Logo = "M512 40.96C249.344 40.96 35.84 252.416 35.84 512s213.504 471.04 476.16 471.04c103.424 0 202.752-33.28 286.72-96.256l1.536-1.536c5.12-5.632 7.68-12.8 7.68-19.968 0-16.896-13.824-30.208-30.72-30.208-7.68 0-15.36 2.56-20.992 7.68h-0.512c-71.68 52.224-155.648 79.36-243.712 79.36-227.328 0-412.16-182.784-412.16-407.552 0-224.768 184.832-407.552 412.16-407.552s412.16 182.784 412.16 407.552c0 68.608-15.872 132.608-46.592 190.464-0.512 1.024-1.024 2.048-1.024 3.072-0.512 2.048-1.536 4.608-1.536 8.192 0 16.896 13.824 30.208 30.72 30.208 12.288 0 23.04-7.168 28.16-18.432 35.84-68.608 53.76-141.312 53.76-216.064 0.512-259.584-212.992-471.04-475.648-471.04z M812.032 483.328c-31.744-20.992-71.68 1.536-78.848 6.144-1.024 0.512-104.448 61.44-128 74.752-8.192 4.608-22.528-0.512-27.136-4.096-31.232-36.352-54.272-70.656-68.608-102.4-13.312-29.184 0.512-41.472 3.072-43.52 7.168-4.608 114.688-68.608 143.36-83.456 24.064-12.288 40.96-25.088 46.08-45.056 3.072-13.312 0-27.136-9.216-39.936-22.016-31.744-172.544-84.992-311.296-3.584-157.184 91.648-152.064 242.688-150.528 292.352v9.216c0 18.944-12.8 37.376-14.848 40.448l-20.992 21.504c-6.144 6.144-9.216 13.824-9.216 22.528 0 8.704 3.584 16.384 9.728 22.528 12.8 12.288 32.768 11.776 45.056-0.512l22.528-23.552 0.512-0.512c3.072-3.584 30.208-38.4 30.208-81.92l-0.512-11.264c-1.536-44.544-5.632-162.816 119.296-235.52 88.064-51.2 173.056-32.256 208.896-19.968-36.864 19.456-143.36 83.456-144.896 84.48-22.016 14.336-55.808 58.88-26.112 122.88 17.408 37.376 43.52 76.8 80.896 120.32 14.336 17.408 62.976 37.376 103.424 15.36 24.576-13.312 125.44-73.216 130.048-75.776 2.048-1.024 4.608-2.56 7.68-3.584 0 2.56-0.512 6.144-1.024 10.752-5.632 35.84-35.328 155.136-191.488 181.76-49.664 8.704-89.6 3.584-121.856-0.512h-0.512c-37.888-4.608-73.216-9.216-101.888 14.336-31.232 26.112-40.96 34.304-35.84 54.272 3.584 14.336 16.384 24.064 30.72 24.064 2.56 0 5.12-0.512 7.68-1.024 6.656-1.536 12.8-5.632 16.896-10.752 2.048-2.048 7.68-6.656 20.992-18.432 6.656-5.632 25.088-3.584 52.736 0 34.816 4.608 81.92 10.24 141.312 0.512 157.184-26.624 228.864-138.752 243.2-234.496 7.68-38.912 0-64.512-21.504-78.336z"}
  110. ToolTipService.SetPlacement(ItemInstall, Primitives.PlacementMode.Right)
  111. ToolTipService.SetHorizontalOffset(ItemInstall, -50)
  112. ToolTipService.SetVerticalOffset(ItemInstall, 2.5)
  113. ToolTipService.SetShowDuration(ItemInstall, 2333333)
  114. FrmSelectLeft.PanList.Children.Add(ItemInstall)
  115. AddHandler ItemInstall.Click, AddressOf ModpackInstall
  116. '边距
  117. FrmSelectLeft.PanList.Children.Add(New FrameworkElement With {.Height = 10, .IsHitTestVisible = False})
  118. '确认勾选状态
  119. For i = 0 To McFolderList.Count - 1
  120. If McFolderList(i).Path = PathMcFolder Then
  121. CType(FrmSelectLeft.PanList.Children(i + 1), MyListItem).Checked = True '去掉第一个标题
  122. Exit Sub
  123. End If
  124. Next
  125. If McFolderList.Count = 0 Then
  126. Throw New ArgumentNullException("没有可用的 Minecraft 文件夹")
  127. Else
  128. Setup.Set("LaunchFolderSelect", McFolderList(0).Path.Replace(Path, "$"))
  129. CType(FrmSelectLeft.PanList.Children(1), MyListItem).Checked = True
  130. End If
  131. Catch ex As Exception
  132. Log(ex, "构建 Minecraft 文件夹列表 UI 出错", LogLevel.Feedback)
  133. Finally
  134. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表
  135. End Try
  136. End Sub
  137. Private McFolderListLast As List(Of McFolder)
  138. '添加文件夹
  139. Public Sub Add_Click()
  140. Dim NewFolder As String = ""
  141. '检查是否有下载任务
  142. If HasDownloadingTask() Then
  143. Hint("请不要在下载过程中添加游戏文件夹!", HintType.Critical)
  144. Exit Sub
  145. End If
  146. Try
  147. '获取输入
  148. NewFolder = SelectFolder()
  149. If NewFolder = "" Then Exit Sub
  150. If NewFolder.Contains("!") OrElse NewFolder.Contains(";") Then Hint("Minecraft 文件夹路径中不能含有感叹号或分号!", HintType.Critical) : Exit Sub
  151. '要求输入显示名称
  152. Dim SplitedNames As String() = NewFolder.TrimEnd("\").Split("\")
  153. Dim DefaultName As String = If(SplitedNames.Last = ".minecraft", If(SplitedNames.Count >= 3, SplitedNames(SplitedNames.Count - 2), ""), SplitedNames.Last)
  154. If DefaultName.Length > 40 Then DefaultName = DefaultName.Substring(0, 39)
  155. Dim NewName As String = MyMsgBoxInput(DefaultName, New ObjectModel.Collection(Of Validate) From {
  156. New ValidateNullOrWhiteSpace, New ValidateLength(1, 40), New ValidateExcept({">", "|"})
  157. },, "输入显示名称",, "取消")
  158. If String.IsNullOrWhiteSpace(NewName) Then Exit Sub
  159. '添加文件夹
  160. AddFolder(NewFolder, NewName, True)
  161. Catch ex As Exception
  162. Log(ex, "添加文件夹失败(" & NewFolder & ")", LogLevel.Feedback)
  163. End Try
  164. End Sub
  165. Public Shared Sub AddFolder(FolderPath As String, DisplayName As String, ShowHint As Boolean)
  166. RunInThread(
  167. Sub()
  168. Try
  169. If Not FolderPath.EndsWith("\") Then FolderPath &= "\" '加上斜杠……
  170. '检查文件夹权限
  171. If Not CheckPermission(FolderPath) Then
  172. If ShowHint Then
  173. Hint("添加文件夹失败:PCL 没有访问该文件夹的权限!", HintType.Critical)
  174. Exit Sub
  175. Else
  176. Throw New Exception("PCL 没有访问文件夹的权限:" & FolderPath)
  177. End If
  178. End If
  179. '检查实际的 Minecraft 文件夹位置(没有问题,或是在子文件夹中)
  180. If Not CheckPermission(FolderPath & "versions\") Then
  181. For Each Folder As DirectoryInfo In New DirectoryInfo(FolderPath).GetDirectories
  182. If CheckPermission(Folder.FullName & "\versions\") Then
  183. FolderPath = Folder.FullName & "\"
  184. Exit For
  185. End If
  186. Next
  187. End If
  188. '判断是否已经添加过,若添加过则直接修改自定义名
  189. Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|"))
  190. Dim IsAdded As Boolean = False
  191. Dim IsReplace As Boolean = False
  192. For i = 0 To Folders.Count - 1
  193. Dim Folder As String = Folders(i)
  194. If Folder = "" Then Continue For
  195. If Folder.Split(">")(1) = FolderPath Then
  196. IsAdded = True
  197. If Folder.Split(">")(0) = DisplayName Then
  198. If ShowHint Then Hint("此文件夹已在列表中!", HintType.Info)
  199. Exit Sub
  200. Else
  201. Folders(i) = DisplayName & ">" & FolderPath
  202. IsReplace = True
  203. If ShowHint Then Hint("文件夹名称已更新为 " & DisplayName & " !", HintType.Finish)
  204. End If
  205. Exit For
  206. End If
  207. Next
  208. '如果没有添加过,则添加进去
  209. If Not IsAdded Then Folders.Add(DisplayName & ">" & FolderPath)
  210. '保存
  211. Setup.Set("LaunchFolders", Join(Folders.ToArray, "|"))
  212. '切换选择并更新列表
  213. Setup.Set("LaunchFolderSelect", FolderPath.Replace(Path, "$"))
  214. McFolderListLoader.Start(IsForceRestart:=True)
  215. '提示
  216. If IsReplace Then Exit Sub
  217. If ShowHint Then Hint("文件夹 " & DisplayName & " 已添加!", HintType.Finish)
  218. '自动关闭版本隔离
  219. '1. 根目录中存在数个 Mod
  220. Dim ModFolder As New DirectoryInfo(FolderPath & "mods\")
  221. If Not (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Count >= 3) Then Exit Sub
  222. '2. 版本数较少,可能为整合包
  223. Dim VersionFolder As New DirectoryInfo(FolderPath & "versions\")
  224. If Not (VersionFolder.Exists AndAlso VersionFolder.EnumerateDirectories.Count <= 3) Then Exit Sub
  225. '3. 能够找到可安装 Mod 的版本
  226. For Each VersionPath In VersionFolder.EnumerateDirectories
  227. Dim Version As New McVersion(VersionPath.FullName)
  228. Version.Load()
  229. If Not Version.Modable Then Continue For
  230. '4. 该版本的隔离文件夹下不存在 mods
  231. Dim ModIndieFolder As New DirectoryInfo(Version.Path & "mods\")
  232. If ModIndieFolder.Exists AndAlso ModIndieFolder.EnumerateFiles.Count > 0 Then Exit Sub
  233. '满足以上全部条件则视为根目录整合包
  234. Setup.Set("VersionArgumentIndie", 2, Version:=Version)
  235. Log("[Setup] 已自动关闭单版本隔离:" & Version.Name, LogLevel.Debug)
  236. Next
  237. Catch ex As Exception
  238. Log(ex, "向文件夹列表中添加新文件夹失败", LogLevel.Feedback)
  239. End Try
  240. End Sub)
  241. End Sub
  242. '创建文件夹
  243. Public Sub Create_Click()
  244. '检查是否有下载任务
  245. If HasDownloadingTask() Then
  246. Hint("请不要在下载过程中创建游戏文件夹!", HintType.Critical)
  247. Exit Sub
  248. End If
  249. If Not Directory.Exists(Path & ".minecraft\") Then
  250. Directory.CreateDirectory(Path & ".minecraft\")
  251. Directory.CreateDirectory(Path & ".minecraft\versions\")
  252. Setup.Set("LaunchFolderSelect", "$.minecraft\")
  253. Hint("新建 .minecraft 文件夹成功!", HintType.Finish)
  254. End If
  255. McFolderListLoader.Start(IsForceRestart:=True)
  256. End Sub
  257. '右键菜单
  258. Public Sub Remove_Click(sender As Object, e As RoutedEventArgs)
  259. Try
  260. Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
  261. '若为 “移除”,则提醒是否删除 PCL 的配置文件
  262. If Folder.Type = McFolderType.Custom Then
  263. Select Case MyMsgBox("是否需要清理 PCL 在该文件夹中的配置文件?" & vbCrLf & "这包括各个版本的独立设置(如自定义图标、第三方登录配置)等,对游戏本身没有影响。", "配置文件清理", "删除", "保留", "取消")
  264. Case 1
  265. '删除配置文件
  266. If File.Exists(Folder.Path & "PCL.ini") Then File.Delete(Folder.Path & "PCL.ini")
  267. If Directory.Exists(Folder.Path & "versions\") Then
  268. For Each Version In New DirectoryInfo(Folder.Path & "versions\").EnumerateDirectories
  269. If Directory.Exists(Version.FullName & "\PCL\") Then Directory.Delete(Version.FullName & "\PCL\", True)
  270. Next
  271. End If
  272. Case 2
  273. '不删除
  274. Case 3
  275. '取消
  276. Exit Sub
  277. End Select
  278. End If
  279. '若修改了本部分代码,应对应修改 Delete_Click 中的代码
  280. '获取并删除列表项
  281. Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|"))
  282. Dim Name As String = ""
  283. For i = 0 To Folders.Count - 1
  284. If Folders(i) = "" Then Exit For
  285. If Folders(i).ToString.EndsWith(Folder.Path) Then
  286. Name = Folders(i).ToString.Split(">")(0)
  287. Folders.RemoveAt(i)
  288. Exit For
  289. End If
  290. Next
  291. '保存
  292. Setup.Set("LaunchFolders", If(Folders.Count = 0, "", Join(Folders.ToArray, "|")))
  293. Hint(If(Folder.Type = McFolderType.Custom, "文件夹 " & Name & " 已从列表中移除!", "文件夹名称已复原!"), HintType.Finish)
  294. McFolderListLoader.Start(IsForceRestart:=True)
  295. Catch ex As Exception
  296. Log(ex, "从列表中移除游戏文件夹失败", LogLevel.Feedback)
  297. End Try
  298. End Sub
  299. Public Sub Delete_Click(sender As Object, e As RoutedEventArgs)
  300. Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
  301. Dim DeleteText As String = If((Folder.Type = McFolderType.Original OrElse Folder.Type = McFolderType.RenamedOriginal) AndAlso Folder.Path = Path & ".minecraft\" AndAlso McFolderList.Count = 1, "清空", "删除")
  302. If MyMsgBox("你确定要" & DeleteText & "这个文件夹吗?" & vbCrLf & "这会导致该文件夹中的所有存档与其他文件永久消失,且不可恢复!", "删除警告", "取消", "继续") = 1 Then Exit Sub
  303. If MyMsgBox(DeleteText & "这个文件夹会导致该文件夹中的所有文件永久消失,且不可恢复!" & vbCrLf & "这是最后一次警告!", "删除警告", DeleteText, "取消",, True) = 2 Then Exit Sub
  304. '移出列表
  305. If Folder.Type = McFolderType.Custom Then
  306. Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|"))
  307. For i = 0 To Folders.Count - 1
  308. If Folders(i) = "" Then Exit For
  309. If Folders(i).ToString.EndsWith(Folder.Path) Then
  310. 'Name = Folders(i).ToString.Split(">")(0)
  311. Folders.RemoveAt(i)
  312. Exit For
  313. End If
  314. Next
  315. Setup.Set("LaunchFolders", If(Folders.Count = 0, "", Join(Folders.ToArray, "|")))
  316. End If
  317. RunInNewThread(Sub()
  318. '删除文件夹
  319. Try
  320. Hint("正在" & DeleteText & "文件夹 " & Folder.Name & "!", HintType.Info)
  321. DeleteDirectory(Folder.Path)
  322. If DeleteText = "清空" Then Directory.CreateDirectory(Folder.Path)
  323. Hint("已" & DeleteText & "文件夹 " & Folder.Name & "!", HintType.Finish)
  324. Catch ex As Exception
  325. Log(ex, DeleteText & "文件夹 " & Folder.Name & " 失败", LogLevel.Hint)
  326. Finally
  327. '刷新列表
  328. McFolderListLoader.Start(IsForceRestart:=True)
  329. End Try
  330. End Sub, "Folder Delete " & GetUuid(), ThreadPriority.BelowNormal)
  331. End Sub
  332. Public Sub Open_Click(sender As Object, e As RoutedEventArgs)
  333. OpenExplorer("""" & CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Info & """")
  334. End Sub
  335. Public Sub Refresh_Click(sender As Object, e As RoutedEventArgs)
  336. Dim Data As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
  337. WriteIni(Data.Path & "PCL.ini", "VersionCache", "") '删除缓存以强制要求下一次加载时更新列表
  338. If Data.Path = PathMcFolder Then LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  339. End Sub
  340. Public Sub Rename_Click(sender As Object, e As RoutedEventArgs)
  341. Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
  342. Try
  343. '获取输入
  344. Dim NewName As String = MyMsgBoxInput(Folder.Name, New ObjectModel.Collection(Of Validate) From {New ValidateNullOrWhiteSpace, New ValidateLength(1, 30), New ValidateExcept({">", "|"})},
  345. , "输入新名称",, "取消")
  346. If String.IsNullOrWhiteSpace(NewName) Then Exit Sub
  347. '修改自定义名
  348. Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|"))
  349. Dim IsAdded As Boolean = False
  350. For i = 0 To Folders.Count - 1
  351. Dim FolderCurrent As String = Folders(i)
  352. If FolderCurrent = "" Then Continue For
  353. If FolderCurrent.Split(">")(1) = Folder.Path Then
  354. IsAdded = True
  355. If FolderCurrent.Split(">")(0) = NewName Then
  356. '名称未修改
  357. Exit Sub
  358. Else
  359. Folders(i) = NewName & ">" & Folder.Path
  360. End If
  361. Exit For
  362. End If
  363. Next
  364. '如果没有添加过,则添加进去(因为修改了默认项的名称)
  365. If Not IsAdded Then Folders.Add(NewName & ">" & Folder.Path)
  366. Hint("文件夹名称已更新为 " & NewName & " !", HintType.Finish)
  367. '保存
  368. Setup.Set("LaunchFolders", Join(Folders.ToArray, "|"))
  369. McFolderListLoader.Start(IsForceRestart:=True)
  370. Catch ex As Exception
  371. Log(ex, "重命名文件夹失败", LogLevel.Feedback)
  372. End Try
  373. End Sub
  374. '点击选项
  375. Public Sub Folder_Change(sender As MyListItem, e As RouteEventArgs)
  376. If Not e.RaiseByMouse OrElse Not sender.Checked Then Exit Sub
  377. '检查是否有下载任务
  378. If HasDownloadingTask(True) Then
  379. Hint("请不要在下载过程中切换游戏文件夹!", HintType.Critical)
  380. e.Handled = True
  381. Exit Sub
  382. End If
  383. '更换
  384. Setup.Set("LaunchFolderSelect", CType(sender.Tag, McFolder).Path.Replace(Path, "$"))
  385. McFolderListLoader.Start(IsForceRestart:=True)
  386. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表
  387. End Sub
  388. End Class