Explorateur avec treegadget OK ! Mais l'icone?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Explorateur avec treegadget OK ! Mais l'icone?

Message 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
Vive le temps libre !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Merci Denis
C'est plus jolie avec des petits icones :D
Vive le temps libre !
Répondre