#Requires AutoHotkey v2
Gui1 := Gui()
Gui1.OnEvent('Close', (*) => ExitApp())
DefaultDir := "C:\Program Files"
Text1 := Gui1.Add("Text", "", "DefaultDir:")
Edit1 := Gui1.Add("Edit", "W250 X" Gui1.MarginY " XM", DefaultDir)
Button1 := Gui1.Add("Button", "X" Gui1.MarginY " XM", "Change")
Button1.OnEvent('Click', ChangeDefaultDir)
Text2 := Gui1.Add("Text", "X" Gui1.MarginY " XM", "Selected Item:")
Edit2 := Gui1.Add("Edit", "W250 X" Gui1.MarginY " XM")
Settings := Map()
Settings["TreeViewOptions"] := "R15 W250 X" Gui1.MarginX
TreeView1 := TreeViewDirSelect(Gui1, DefaultDir, Settings)
TreeView1.TreeView.OnEvent('ItemSelect', (GuiCtrlObj, Item) => ItemSelect(GuiCtrlObj, Item))
Gui1.Show()
ItemSelect(GuiCtrlObj, Item) {
If (TreeView1.IDToPath.Has(Item))
Edit2.Text := TreeView1.IDToPath[Item]
}
ChangeDefaultDir(Button, Info) {
Gui1.Submit(0)
DefaultDir := Edit1.Text
TreeView1.TreeViewOperations("TreeViewDirSelectRecreate", Gui1, DefaultDir)
}
Class TreeViewDirSelect {
/*
By Bulef
Версия 0.02
---------------------------------------
Тестовые настройки:
Gui1 := Gui()
TreeView1 := TreeViewDirSelect(Gui1, "C:\Program Files")
Gui1.Show()
---------------------------------------
В первой опции (Gui) необходимо дать ссылку на ваш Gui, чтобы разместить TreeView в нём. Эта настройка обязательная.
Вторая опция (DefaultDir) позволяет выбрать директорию по умолчанию, из которой будет происходить открытие папок. Вы можете указать эту настройку пустой (""), чтобы отобразить ваши диски как изначальную директорию.
Третья опция (Settings) позволяет внести дополнительные настройки при создании TreeView. Для этого создайте карту:
Settings := Map()
И добавьте нужную опцию.
Settings["TreeViewOptions"] := "R15"
Позволит добавить опции AHK Gui при создани TreeView (Искать в руководстве AHK по Gui Object).
Settings["ShowHiddenFolders"] := True
Позволит показать скрытые папки. Принимает значение либо True, либо False.
После чего добавьте опцию Settings при создании класса:
TreeView1 := TreeViewDirSelect(Gui1, "C:\Program Files", Settings)
---------------------------------------
Элемент TreeView будет находиться в собственности "TreeView" родительского объекта ("TreeView1"), то есть в "TreeView1.TreeView" как в примере.
---------------------------------------
Также возможно пересоздать TreeView используя внутреннюю функцию "TreeViewOperations".
Для этого вызовите её из родительского объекта и добавьте первой опцию "TreeViewDirSelectRecreate", вставив остальные опции после неё:
TreeView1.TreeViewOperations("TreeViewDirSelectRecreate", Gui1, "C:\Program Files")
Также существует такая опция:
TreeView1.TreeViewOperations("TreeViewDirSelectCreate", Gui1, "C:\Program Files")
Она создаст TreeView заново. Если не знаете точно, что это вам требуется, не используйте её.
---------------------------------------
Для того, чтобы получить, к примеру путь к выбранной в TreeView папке, необходимо получить ID элемента и найти его в карте TreeView1.IDToPath.
Для этого вызываем функцию GetSelection в TreeView.
ItemID := TreeView1.TreeView.GetSelection()
После чего ищем её в TreeView1.IDToPath
Path := TreeView1.IDToPath[ItemID]
Также возможно найти ItemID имея путь в TreeView1.PathToID, если он уже отрисован.
ItemID := TreeView1.PathToID[Path]
Остальные возможные варианты взаимодействия с TreeView ищите в руководстве AHK по TreeView.
*/
__New(Gui, DefaultDir := "", Settings := "") {
This.TreeViewOperations("TreeViewDirSelectCreate", Gui, DefaultDir, Settings)
}
TreeViewOperations(TreeViewDirSelectOption, Gui, DefaultDir := "", Settings := "") {
If (TreeViewDirSelectOption = "TreeViewDirSelectCreate") {
If (IsObject(Settings)) {
If (Settings.Has("TreeViewOptions"))
This.TreeViewOptions := Settings["TreeViewOptions"]
Else
This.TreeViewOptions := ""
If (Settings.Has("ShowHiddenFolders"))
This.ShowHiddenFolders := Settings["ShowHiddenFolders"]
Else
This.ShowHiddenFolders := False
}
Else
If (!IsObject(Settings)) {
This.TreeViewOptions := ""
This.ShowHiddenFolders := False
}
}
Else
If (TreeViewDirSelectOption = "TreeViewDirSelectRecreate") {
If (IsObject(Settings)) {
If (Settings.Has("TreeViewOptions"))
This.TreeViewOptions := Settings["TreeViewOptions"]
If (Settings.Has("ShowHiddenFolders"))
This.ShowHiddenFolders := Settings["ShowHiddenFolders"]
}
}
If (TreeViewDirSelectOption = "TreeViewDirSelectCreate") {
This.TreeView := Gui.Add("TreeView", This.TreeViewOptions)
This.TreeView.OnEvent("ItemExpand", (GuiCtrlObj, Item, Expanded) => This.TreeViewItemExpand(GuiCtrlObj, Item, Expanded))
}
Else
If (TreeViewDirSelectOption = "TreeViewDirSelectRecreate") {
This.TreeView.Opt(This.TreeViewOptions)
This.TreeView.Delete()
}
This.DefaultDir := DefaultDir
This.DrivesList := DriveGetList("FIXED")
This.PathToID := Map()
This.IDToPath := Map()
This.IDToDefaultDir := Map()
This.PreLoadLevels(This.DefaultDir, This.DefaultDir, 2)
This.TreeView.Redraw()
}
PreLoadLevels(Path, DefaultDir, Level) {
PathArray := []
If (Path = "" AND DefaultDir = "") {
Loop Parse This.DrivesList {
DriveName := A_LoopField ":"
PathArray.Push(DriveName)
If (!This.PathToID.Has(DriveName)) {
DriveFullName := DriveGetLabel(DriveName) " (" DriveName ")"
DirID := This.TreeView.Add(DriveFullName)
This.PathToID[DriveName] := DirID
This.IDToPath[DirID] := DriveName
This.IDToDefaultDir[DirID] := ""
}
}
}
Else
PathArray.Push(Path)
If (IsInteger(Level) AND Level >= 1 OR InStr(Level, "=", , 1, ) = 1 AND SubStr(Level, 2, ) >= 1) {
For PathID, Path In PathArray {
Path1 := Path
If (IsInteger(Level) AND Level >= 1 OR Level = "=1")
This.AddItem(Path1, DefaultDir)
If (IsInteger(Level) AND Level >= 2 OR InStr(Level, "=", , 1, ) = 1 AND SubStr(Level, 2, ) >= 2) {
Loop Files Path1 "\*", "D" {
Path2 := A_LoopFileFullPath
If (IsInteger(Level) AND Level >= 2 OR Level = "=2")
This.AddItem(Path2, DefaultDir)
If (IsInteger(Level) AND Level >= 3 OR InStr(Level, "=", , 1, ) = 1 AND SubStr(Level, 2, ) >= 3) {
Loop Files Path2 "\*", "D" {
Path3 := A_LoopFileFullPath
If (IsInteger(Level) AND Level >= 3 OR Level = "=3")
This.AddItem(Path3, DefaultDir)
}
}
}
}
}
}
}
AddItem(Path, DefaultDir) {
Loop Files Path "\*", "D" {
If (!This.ShowHiddenFolders AND InStr(A_LoopFileAttrib, "H", 0))
Continue
HigherDirPath := ""
FullDirPath := A_LoopFileFullPath
TrimmedPath := FullDirPath
If (DefaultDir != "" AND InStr(FullDirPath, DefaultDir, 1, 1, ) = 1)
TrimmedPath := SubStr(FullDirPath, StrLen(DefaultDir "\")+1, )
Loop Parse TrimmedPath, "\", "" {
DirName := A_LoopField
If (HigherDirPath = "")
DirPath := DirName
Else
If (HigherDirPath != "")
DirPath := HigherDirPath "\" DirName
If (!This.PathToID.Has(DirPath)) {
If (HigherDirPath = "")
DirID := This.TreeView.Add(DirName)
Else
If (HigherDirPath != "") {
HigherDirPathID := This.PathToID[HigherDirPath]
DirID := This.TreeView.Add(DirName, HigherDirPathID)
}
This.PathToID[DirPath] := DirID
This.IDToPath[DirID] := FullDirPath
This.IDToDefaultDir[DirID] := DefaultDir
HigherDirPath := DirPath
}
Else
If (This.PathToID.Has(DirPath))
HigherDirPath := DirPath
}
}
}
TreeViewItemExpand(GuiCtrlObj, Item, Expanded) {
If (!Expanded)
Return
Path := This.IDToPath[Item]
DefaultDir := This.IDToDefaultDir[Item]
This.PreLoadLevels(Path, DefaultDir, "=3")
}
}
Различие между нашими вариантами только в том, что в моём можно изменить директорию по умолчанию, из которой будут открываться папки. В остальном можно использовать любой из вариантов.