EnableExplicit
; Global SizeTotal.q
Global grad.d
Global center = 250
Global widthSec = 15
Global c, n, w, h
Structure Files
Name.s ; Имя файла
Size.q ; Размер файла
EndStructure
Structure Tree
DirName.s ; Имя папки.
DirSize.q
List Files.Files() ; Список файлов текущей папки.
List Dirs.Tree() ; Список вложенных папок текущей папки.
EndStructure
Procedure.q ScanDir(*s.Tree, AllDir.s) ; Сохранение структуры указаной папки
Protected Size.q=0, id, Dir.s
If *s=0
ProcedureReturn 0
EndIf
id = ExamineDirectory(#PB_Any, AllDir, "*.*")
If id
While NextDirectoryEntry(id)
If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory ; Папка
Dir = DirectoryEntryName(id)
If Dir<>"." And Dir<>".."
If AddElement(*s\Dirs())
c+1
If c > n
n = c
; Debug n
EndIf
*s\Dirs()\DirName = Dir
Size + ScanDir(*s\Dirs(), AllDir+Dir+#PS$) ; Рекурсивный вызов процедуры
EndIf
c-1
EndIf
Else ; Файл
If AddElement(*s\Files())
*s\Files()\Name = DirectoryEntryName(id)
*s\Files()\Size = DirectoryEntrySize(id)
Size + *s\Files()\Size
EndIf
EndIf
Wend
*s\DirSize = Size
; тут сортировка
SortStructuredList(*s\Dirs(), #PB_Sort_Descending, OffsetOf(Tree\DirSize) , TypeOf(Tree\DirSize))
SortStructuredList(*s\Files(), #PB_Sort_Descending, OffsetOf(Files\Size) , TypeOf(Files\Size))
FinishDirectory(id)
EndIf
ProcedureReturn Size
EndProcedure
; Global path$
Procedure.q View(*s.Tree, Radius, Strt0.d, level) ; Отображение содержимого папки.
Protected StrtF.d, endF.d, PosT
If level > 40 ; проверяем прорисовку по уровням
ProcedureReturn
EndIf
; Static end0.d
PosT = Radius-10
If StartVectorDrawing(CanvasVectorOutput(0))
; MessageRequester("", *s\DirName)
AddPathEllipse(center, center, Radius-widthSec, Radius-widthSec)
AddPathEllipse(center, center, 250, 250)
ClipPath() ; отсекающий вектор
StrtF = Strt0
endF = Strt0
endF + *s\DirSize/grad
If StrtF = endF
StopVectorDrawing()
ProcedureReturn 0
EndIf
MovePathCursor(center, center)
; Debug Radius
; Debug *s\DirName
AddPathCircle(center, center, Radius, StrtF, endF, #PB_Path_Connected)
; ClosePath()
; VectorSourceColor(RGBA(Random(99, 50), Random(99, 50), Random(99, 50), 255))
VectorSourceColor(RGBA(Random(99, 40), Random(99, 40), Random(99, 40), 255))
FillPath()
; VectorSourceColor(RGBA(255, 255, 255, 255))
; MovePathCursor(PosT * Cos(Radian((StrtF+endF)/2))+center, PosT * Sin(Radian((StrtF+endF)/2))+center)
; DrawVectorText(Str(*s\DirSize/1024))
; end0 = endF
; AddGadgetItem(#TreeFileFolder, -1, "("+*s\DirSize+")" + #TAB$ + *s\DirName, ImageID(#FOLDER))
StopVectorDrawing()
EndIf
Radius + widthSec
ForEach *s\Dirs() ; Отображение всех подпапок текущей папки.
; SaveVectorState()
; View(*s\Dirs(), Radius, Strt0, level + 1) ; Рекурсивный вызов процедуры
Strt0 + View(*s\Dirs(), Radius, Strt0, level + 1) ; Рекурсивный вызов процедуры
; RestoreVectorState()
Next
; Radius - widthSec
If StartVectorDrawing(CanvasVectorOutput(0))
AddPathEllipse(center, center, Radius-widthSec, Radius-widthSec)
AddPathEllipse(center, center, 250, 250)
ClipPath() ; отсекающий вектор
; Debug Radius
endF = Strt0
ForEach *s\Files() ; Отображение списка файлов текущей папки.
; MessageRequester("", *s\Files()\Name)
StrtF = endF
endF + *s\Files()\Size/grad
If StrtF = endF
Continue
EndIf
MovePathCursor(center, center)
AddPathCircle(center, center, Radius, StrtF, endF, #PB_Path_Connected)
; ClosePath()
; VectorSourceColor(RGBA(Random(99, 50), Random(99, 50), Random(99, 50), 255))
VectorSourceColor(RGBA(Random(155, 122), Random(155, 122), Random(155, 122), 255))
FillPath()
; VectorSourceColor(RGBA(255, 255, 255, 255))
; MovePathCursor(PosT * Cos(Radian((StrtF+endF)/2))+center, PosT * Sin(Radian((StrtF+endF)/2))+center)
; DrawVectorText(Str(*s\Files()\Size/1024))
Next
StopVectorDrawing()
EndIf
ProcedureReturn *s\DirSize/grad
EndProcedure
Define s.Tree ; Создание экземпляра структуры.
Define Param$, tmp$, Pos
Param$ = ProgramParameter()
If FileSize(Param$) = -2
If Right(Param$, 1) <> #PS$
Param$ + #PS$
EndIf
s\DirName = Param$
Else
Param$ = PathRequester("Папка для сканирования", "")
; s\DirName = "/home/user/My_root/Install_arch/Find_GUI_AUR/pkg/test/"
If Param$ And Right(Param$, 1) <> #PS$
Param$ + #PS$
EndIf
s\DirName = Param$
EndIf
#Window_Main = 0
If s\DirName
; | #PB_Window_ScreenCentered
If OpenWindow(#Window_Main, 0, 0, 500, 550, "Circle", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)
StringGadget(2 , 5 , 5 , 410 , 30 , GetUserDirectory(#PB_Directory_Downloads))
ButtonGadget (1, 415, 5, 90, 20, "pic")
CanvasGadget(0, 0, 50, 500, 500)
c=0
n=0
ScanDir(s, s\DirName)
grad = s\DirSize/360
widthSec = 250/(n+1)
; If widthSec>30
; widthSec=30
; EndIf
; Debug widthSec
; If StartVectorDrawing(CanvasVectorOutput(0))
View(s, widthSec, 0, 0)
; StopVectorDrawing()
; EndIf
; MessageRequester("", "готово")
Repeat
Select WaitWindowEvent()
; Case #PB_Event_SizeWindow
; w = WindowWidth(#Window_Main)
; h = WindowHeight(#Window_Main) - 50
; ResizeGadget(0, #PB_Ignore, #PB_Ignore, w, h)
; If StartVectorDrawing(CanvasVectorOutput(0))
; ScaleCoordinates(w/500.0, h/500.0)
; StopVectorDrawing()
; EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case 1
; s\DirName = GetGadgetText(2)
; If FileSize(s\DirName) = -2
; ScanDir(s, s\DirName)
; EndIf
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(#Window_Main)
End
EndSelect
ForEver
EndIf
EndIf