Page 1 sur 1

Explorateur avec treegadget OK ! Mais l'icone?

Publié : dim. 08/janv./2006 15:35
par olivier
Pour commencer je vous souhaite une bonne année et plein de jolis programmes pour vous et votre famille :D

Je viens d'arriver presque au bout de mon explorateur avec un treegadget !

Quel est l'interet ? Par exemple je suis sur un lecteur de photo. Personnellement j'ai un répertoire précis ou je met mes photos, et je n'ai pas envie de voir apparaitre dans mon explorateur tout le reste de mon ordinateur. Alors avec cet explorateur, on précise le repertoire de base et on ne voie pas ce qui au dessus. C'est plus clair !

Des partie de ce code ne sont pas de moi et je remercie au passage ceux qui les ont fait.

Si vous avez des améliorations à apporter, n'hesiter pas.

Par exemple je recherche comment mettre l'icone dossier devant les noms, c'est tout bête mais je m'embrouille...

Voilà le code :

Code : Tout sélectionner

Dim StateOfNodes(1000)

NewList nom_rep.s()
#tree_gadget=1

Procedure remplir_tree(rep$,place_depart,id_gadget_tree)

    ClearList(nom_rep())  
    ;{1 : Créer la liste des sous répertoires
    Num=-1
    If rep$<>""
        ExamineDirectory(0, rep$, "")
        nb_fichier=0
        
        Repeat
            type = NextDirectoryEntry()
            If type>0
                nom$ = DirectoryEntryName()
                
                If ((type=2) And (nom$=".")) : type=3 : EndIf
                If ((type=2) And (nom$="..")) : type=3 :  EndIf
                
                If type=2 
                    Num=Num+1
                    AddElement(nom_rep())
                    nom_rep()=nom$
                EndIf
            EndIf
        Until type =0 ;***** y a plus de fichier, dans ce répertoire
    EndIf;}
    
    ;{2 : Trier la liste
    SortList(nom_rep(),3,0,Num)
    ;}
    
    ;{3 : Remplir le treegadget
    If Num>-1
        SelectElement(nom_rep(),Num)
        If GetGadgetItemText(id_gadget_tree,place_depart+1,0)<>nom_rep() ; test pour savoir si le tree est déjà rempli
            
            If GetGadgetItemText(id_gadget_tree,place_depart+1,0)="Cliquer sur le rep pour refaire"
                RemoveGadgetItem(id_gadget_tree,place_depart+1)
            EndIf
            rep_sup=0
            
            For i=0 To Num
                
                ;insert l'élément i
                SelectElement(nom_rep(),i)
                OpenTreeGadgetNode(id_gadget_tree, place_depart)
                AddGadgetItem(id_gadget_tree, place_depart+1, nom_rep());,ess)
                
                ;{ Vérification de l'existance d'un sous sous répertoire
                rep_sup=0
                ExamineDirectory(0, rep$+nom_rep()+"\", "")
                nb_fichier=0
                
                Repeat
                    type = NextDirectoryEntry()
                    If type>0
                        nom$ = DirectoryEntryName()
                        
                        If ((type=2) And (nom$=".")) : type=3 : EndIf
                        If ((type=2) And (nom$="..")) : type=3 :  EndIf
                        
                        If type=2 
                            rep_sup=1 ; il y a des sous répertoire dans ce répertoire
                            
                        EndIf
                    EndIf
                Until type =0 Or rep_sup=1;***** y a plus de fichier, dans ce répertoire
                ;}
                
                If rep_sup=1 ;il y a des sous répertoire on crer un sous tree
                    
                    OpenTreeGadgetNode(id_gadget_tree, place_depart+1)
                    AddGadgetItem(id_gadget_tree, place_depart+2, "Cliquer sur le rep pour refaire")
                    CloseTreeGadgetNode(id_gadget_tree)
                    
                EndIf
            Next
        EndIf
    EndIf
    ;}
    
EndProcedure

Procedure.s chemin_tree_num(Num,id_gadget_tree)
    FullPath.s=""
    CurrentItem.l = Num
    CurrentText.s = GetGadgetItemText(id_gadget_tree, CurrentItem, 0)
    ItemToWalk.l = CurrentItem
    FullPath   = CurrentText.s
    
    Repeat
        hItem.l        = GadgetItemID(id_gadget_tree, ItemToWalk)
        hParent.l      = SendMessage_(GadgetID(id_gadget_tree), #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
        ParentNumber.l = TreeGadgetItemNumber(id_gadget_tree, hParent)
        ParentText.s   = GetGadgetItemText(id_gadget_tree, ParentNumber, 0)
        FullPath.s     = ParentText + "\" + FullPath
        ItemToWalk     = ParentNumber
    Until ItemToWalk = -1
    
    If Left(FullPath.s, 1) = "\"
        FullPath.s = Mid(FullPath.s, 2, Len(FullPath.s) - 1)
    EndIf
    
    ProcedureReturn FullPath
EndProcedure

Procedure.l DetectClickOnNodeCross(id_gadget_tree)
    For i = 0 To CountGadgetItems(id_gadget_tree)-1
        If StateOfNodes(i) <> #PB_Tree_Expanded & GetGadgetItemState(id_gadget_tree,i)
            StateOfNodes(i) = #PB_Tree_Expanded & GetGadgetItemState(id_gadget_tree,i)
            ProcedureReturn(i)
        EndIf
    Next i
    ProcedureReturn(-1)
EndProcedure

Procedure.s gestion_tree_gadget(Repertoire_base$,id_gadget_tree)

    If EventType()=0 
        NodeClicked = DetectClickOnNodeCross(id_gadget_tree)

        If NodeClicked <> -1 ;si l'utilisateur clic sur un noeud
            remplir_tree(Repertoire_base$+chemin_tree_num(NodeClicked,id_gadget_tree)+"\",NodeClicked,id_gadget_tree)
        Else ;si l'utilisateur doubleclic sur un répertoire il faut le remplir aussi
            remplir_tree(Repertoire_base$+chemin_tree_num(GetGadgetState(id_gadget_tree),id_gadget_tree),GetGadgetState(id_gadget_tree),id_gadget_tree)
        EndIf 
    EndIf
    ProcedureReturn Repertoire_base$+chemin_tree_num(GetGadgetState(id_gadget_tree),id_gadget_tree)+"\"
EndProcedure


OpenWindow(0,10,10,500,500,#PB_Window_SystemMenu,"ess")
CreateGadgetList(WindowID())

TreeGadget(#tree_gadget,10,10,240,400,#PB_Tree_AlwaysShowSelection )

remplir_tree("c:\",-1,#tree_gadget)

Repeat
    Evenement=WaitWindowEvent()

    If EventWindowID()=0
        Select Evenement            
            
            Case #PB_EventGadget; *****************Choix d'un bouton
                Select EventGadgetID()
                    Case #tree_gadget
                        dossier_selectionner$=gestion_tree_gadget("c:\",#tree_gadget)
                        Debug "---------------"
                        Debug dossier_selectionner$

                EndSelect

            Case #WM_CLOSE ; ***************************#PB_EventCloseWindow
                Quit=1
                
        EndSelect
    EndIf

    
Until Quit = 1

End 
A pluche
Stef

Publié : dim. 08/janv./2006 16:12
par Anonyme2
essaye ce code (c'est le tien auquel j'ai ajouté 1 structure , plus une ligne puis j'ai modifié le addgadgetitem pour ajouter l'identificateur d'image)


ajouté la structure lignes 4 à 10

ajouté la recherche d'icône ligne 66

modifié pour afficher l'icône ligne 69

J'utilise un API windows pour extraire l'icône

Code : Tout sélectionner

; /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
      ; ajouté la structure  suivante
      
Structure SH_FILEINFO ; la structure SHFILEINFO PB est fausse
      hIcon.l
      iIcon.l
      dwAttributes.l
      szDisplayName.b[#MAX_PATH]
      szTypeName.b[80]
EndStructure


Dim StateOfNodes(1000)

NewList nom_rep.s()
#tree_gadget=1

Procedure remplir_tree(rep$,place_depart,id_gadget_tree)

    ClearList(nom_rep()) 
    ;{1 : Créer la liste des sous répertoires
    Num=-1
    If rep$<>""
        ExamineDirectory(0, rep$, "")
        nb_fichier=0
       
        Repeat
            type = NextDirectoryEntry()
            If type>0
                nom$ = DirectoryEntryName()
               
                If ((type=2) And (nom$=".")) : type=3 : EndIf
                If ((type=2) And (nom$="..")) : type=3 :  EndIf
               
                If type=2
                    Num=Num+1
                    AddElement(nom_rep())
                    nom_rep()=nom$
                EndIf
            EndIf
        Until type =0 ;***** y a plus de fichier, dans ce répertoire
    EndIf;}
   
    ;{2 : Trier la liste
    SortList(nom_rep(),3,0,Num)
    ;}

    ;{3 : Remplir le treegadget
    If Num>-1
        SelectElement(nom_rep(),Num)
        If GetGadgetItemText(id_gadget_tree,place_depart+1,0)<>nom_rep() ; test pour savoir si le tree est déjà rempli
           
            If GetGadgetItemText(id_gadget_tree,place_depart+1,0)="Cliquer sur le rep pour refaire"
                RemoveGadgetItem(id_gadget_tree,place_depart+1)
            EndIf
            rep_sup=0
           
            For i=0 To Num
               
                ;insert l'élément i
                SelectElement(nom_rep(),i)
                OpenTreeGadgetNode(id_gadget_tree, place_depart)

      ; /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
      ; ajouté la ligne suivante
                SHGetFileInfo_(rep$+nom_rep(), 0, @InfosFile.SH_FILEINFO, SizeOf(SH_FILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON )

      ; /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
      ; modifié la ligne suivante (ajouté InfosFile\hIcon comme identificateur d'image)

                AddGadgetItem(id_gadget_tree, place_depart+1, nom_rep(), InfosFile\hIcon);,ess)
               
                ;{ Vérification de l'existance d'un sous sous répertoire
                rep_sup=0
                ExamineDirectory(0, rep$+nom_rep()+"\", "")
                nb_fichier=0
               
                Repeat
                    type = NextDirectoryEntry()
                    If type>0
                        nom$ = DirectoryEntryName()
                       
                        If ((type=2) And (nom$=".")) : type=3 : EndIf
                        If ((type=2) And (nom$="..")) : type=3 :  EndIf
                       
                        If type=2
                            rep_sup=1 ; il y a des sous répertoire dans ce répertoire
                           
                        EndIf
                    EndIf
                Until type =0 Or rep_sup=1;***** y a plus de fichier, dans ce répertoire
                ;}
               
                If rep_sup=1 ;il y a des sous répertoire on crer un sous tree
                   
                    OpenTreeGadgetNode(id_gadget_tree, place_depart+1)
                    AddGadgetItem(id_gadget_tree, place_depart+2, "Cliquer sur le rep pour refaire")
                    CloseTreeGadgetNode(id_gadget_tree)
                   
                EndIf
            Next
        EndIf
    EndIf
    ;}
   
EndProcedure

Procedure.s chemin_tree_num(Num,id_gadget_tree)
    FullPath.s=""
    CurrentItem.l = Num
    CurrentText.s = GetGadgetItemText(id_gadget_tree, CurrentItem, 0)
    ItemToWalk.l = CurrentItem
    FullPath   = CurrentText.s
   
    Repeat
        hItem.l        = GadgetItemID(id_gadget_tree, ItemToWalk)
        hParent.l      = SendMessage_(GadgetID(id_gadget_tree), #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
        ParentNumber.l = TreeGadgetItemNumber(id_gadget_tree, hParent)
        ParentText.s   = GetGadgetItemText(id_gadget_tree, ParentNumber, 0)
        FullPath.s     = ParentText + "\" + FullPath
        ItemToWalk     = ParentNumber
    Until ItemToWalk = -1
   
    If Left(FullPath.s, 1) = "\"
        FullPath.s = Mid(FullPath.s, 2, Len(FullPath.s) - 1)
    EndIf
   
    ProcedureReturn FullPath
EndProcedure

Procedure.l DetectClickOnNodeCross(id_gadget_tree)
    For i = 0 To CountGadgetItems(id_gadget_tree)-1
        If StateOfNodes(i) <> #PB_Tree_Expanded & GetGadgetItemState(id_gadget_tree,i)
            StateOfNodes(i) = #PB_Tree_Expanded & GetGadgetItemState(id_gadget_tree,i)
            ProcedureReturn(i)
        EndIf
    Next i
    ProcedureReturn(-1)
EndProcedure

Procedure.s gestion_tree_gadget(Repertoire_base$,id_gadget_tree)

    If EventType()=0
        NodeClicked = DetectClickOnNodeCross(id_gadget_tree)

        If NodeClicked <> -1 ;si l'utilisateur clic sur un noeud
            remplir_tree(Repertoire_base$+chemin_tree_num(NodeClicked,id_gadget_tree)+"\",NodeClicked,id_gadget_tree)
        Else ;si l'utilisateur doubleclic sur un répertoire il faut le remplir aussi
            remplir_tree(Repertoire_base$+chemin_tree_num(GetGadgetState(id_gadget_tree),id_gadget_tree),GetGadgetState(id_gadget_tree),id_gadget_tree)
        EndIf
    EndIf
    ProcedureReturn Repertoire_base$+chemin_tree_num(GetGadgetState(id_gadget_tree),id_gadget_tree)+"\"
EndProcedure


OpenWindow(0,10,10,500,500,#PB_Window_SystemMenu,"ess")
CreateGadgetList(WindowID())

TreeGadget(#tree_gadget,10,10,240,400,#PB_Tree_AlwaysShowSelection )

remplir_tree("c:\",-1,#tree_gadget)

Repeat
    Evenement=WaitWindowEvent()

    If EventWindowID()=0
        Select Evenement           
           
            Case #PB_EventGadget; *****************Choix d'un bouton
                Select EventGadgetID()
                    Case #tree_gadget
                        dossier_selectionner$=gestion_tree_gadget("c:\",#tree_gadget)
                        Debug "---------------"
                        Debug dossier_selectionner$

                EndSelect

            Case #WM_CLOSE ; ***************************#PB_EventCloseWindow
                Quit=1
               
        EndSelect
    EndIf

   
Until Quit = 1

End 

Publié : dim. 08/janv./2006 18:42
par olivier
Merci Denis
C'est plus jolie avec des petits icones :D