[RESOLUS] TreeGadget Récupérer ID parent

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

[RESOLUS] TreeGadget Récupérer ID parent

Message par microdevweb »

Image

Voila j'aimerais savoir comment récupérer l'ID du parent...
Exemple (voir image) lord d'un drag and drop, l'utilisateur fait glisser une image, j'aimerais savoir si c'est sur Preload ou create et si c'est sur Intro ou Niveau 1.

Je penses que vais être obligé d'utiliser les appis SendMessage_ etc..., mais s'il y a un autre solution.

Merci
Dernière modification par microdevweb le lun. 15/juin/2015 15:51, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: TreeGadget Récupérer ID parent

Message par G-Rom »

Si les fonctions native ne te le permet pas ( ce que j'ignore ) , tu peu structuré plus ton code pour remonté sur les parents , à la manière d'un scenegraph.

Code : Tout sélectionner

Structure node
  *parent.node  ; si NULL c'est que tu est en haut
  List childreen.node()
  gadgetID.l
EndStructure


Procedure AddChildreen(*this.node, *child.node)
  *child\parent = *this
  AddElement(*this\childreen())
  *this\childreen() = *child
EndProcedure


...
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: TreeGadget Récupérer ID parent

Message par microdevweb »

Merci G-Rom,
j'ai trouvé également cette solution

Code : Tout sélectionner

Procedure GetParentTree(Parent,Id,TreeId)
      Protected Niv,N
      For N=Id To 0 Step -1
            Niv=GetGadgetItemAttribute(TreeId,N,#PB_Tree_SubLevel)
            If Niv=Parent
                  ProcedureReturn N
            EndIf
      Next
EndProcedure

Debug GetGadgetItemText(#TreeProject,GetParentTree(0,GetGadgetState(#TreeProject),#TreeProject))
;Renverra Intro ou Niveau 1

Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par falsam »

je pense que ta procédure te renverra "Intro" systématiquement.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par falsam »

Sauf mauvaise compréhension de la procédure GetParentTree(), un code pour illustrer mon doute précédent.

Essaye de glisser des éléments de la liste vers l'arbre.

Le parent renvoyé par la procédure GetParentTree() est systématiquement "Intro".

Code : Tout sélectionner

EnableExplicit

Enumeration
  #mf
  #mflist
  #mftree
EndEnumeration

Procedure GetParentTree(Parent,Id,TreeId)
  Protected Niv,N
  For N=Id To 0 Step -1
    Niv=GetGadgetItemAttribute(TreeId, N, #PB_Tree_SubLevel)
    If Niv=Parent
      ProcedureReturn N  
    EndIf
  Next
EndProcedure


Procedure OnDrag()
  Protected Files.s = ""       
  Protected n
  
  For n = 0 To CountGadgetItems(#mflist)-1
    If GetGadgetItemState(#mflist, n) & #PB_Explorer_Selected
      Files + GetGadgetText(#mflist) + GetGadgetItemText(#mflist, n) + Chr(10)  
    EndIf
  Next
  
  If Files <> ""
    DragFiles(Files)
  EndIf
EndProcedure

Procedure OnDrop()
  Protected n
  Protected Index = GetGadgetState(#mftree)
  Protected Parent.s = GetGadgetItemText(#mftree, GetParentTree(0, Index, #mftree))
  Protected Files.s = EventDropFiles()
  
  Debug parent
  
  If Parent <> "Intro"
    For n = 0 To CountString(Files, Chr(10))
      Debug StringField(Files, n+1, Chr(10))
      AddGadgetItem(#mftree, Index+1 , StringField(Files, n+1, Chr(10)), 0, 3)
    Next
    SetGadgetItemState(#mftree, Index, #PB_Tree_Expanded)
  EndIf
  
EndProcedure


OpenWindow(#mf, 0, 0, 800, 600, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ExplorerListGadget(#mflist, 10, 10, 300, 580, GetHomeDirectory(), #PB_Explorer_MultiSelect)
TreeGadget(#mftree, 400, 10, 390, 580)

AddGadgetItem(#mftree, -1, "Intro")         ;Item 0
AddGadgetItem(#mftree, -1, "Preload", 0, 1) ;Item 1
AddGadgetItem(#mftree, -1, "Image", 0, 2)
AddGadgetItem(#mftree, -1, "Sprite", 0, 2)
AddGadgetItem(#mftree, -1, "Sound", 0, 2)

AddGadgetItem(#mftree, -1, "Create", 0, 1)  ;Item 5
AddGadgetItem(#mftree, -1, "Image", 0, 2)
AddGadgetItem(#mftree, -1, "Sprite", 0, 2)
AddGadgetItem(#mftree, -1, "Sound", 0, 2)

SetGadgetItemState(#mftree, 0, #PB_Tree_Expanded)
SetGadgetItemState(#mftree, 1, #PB_Tree_Expanded)
SetGadgetItemState(#mftree, 5, #PB_Tree_Expanded)

EnableGadgetDrop(#mftree, #PB_Drop_Files,  #PB_Drag_Copy)

BindGadgetEvent(#mflist, @OnDrag(), #PB_EventType_DragStart)
BindEvent(#PB_Event_GadgetDrop, @OnDrop(), #mf, #mftree)

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par microdevweb »

Bonjour falsam, dans le cadre mon projet elle fonctionne. Parent est égale au nœud parent en partant de 0 (Intro,Niveau 1) 1( image, Sprite etc...)
je ferais un petit exemple pour les personnes que cela intéresse (quant j'aurais 5 minutes)
Image
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par microdevweb »

Voila comme promis un code exemple, Une fois lancé faites un drag and drop sur un item de l'arbre

Code : Tout sélectionner

Procedure GetParentTree(Parent,Id,TreeId)
      Protected Niv,N
      For N=Id To 0 Step -1
            Niv=GetGadgetItemAttribute(TreeId,N,#PB_Tree_SubLevel)
            If Niv=Parent
                  ProcedureReturn N
            EndIf
      Next
EndProcedure
Procedure DropTree()
      Debug GetGadgetItemText(0,GetParentTree(0,GetGadgetState(0),0))
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
TreeGadget(0,0,0,800,600)
AddGadgetItem(0,CountGadgetItems(0),"Node 1")
AddGadgetItem(0,CountGadgetItems(0),"Child 1",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Child 2",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Node 2")
AddGadgetItem(0,CountGadgetItems(0),"Child 1",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Child 2",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
EnableGadgetDrop(0,#PB_Drop_Files,#PB_Drag_Copy)
BindEvent(#PB_Event_GadgetDrop,@DropTree(),0,0)
For N=0 To CountGadgetItems(0)-1
      SetGadgetItemState(0,N,#PB_Tree_Expanded)
Next
Repeat
      gEvent=WaitWindowEvent()
Until gEvent=#PB_Event_CloseWindow
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par Micheao »

Merci pour ce partage
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par falsam »

@microdevweb: Je persiste, ta procédure ne donne pas le noeud parent.

Si tu glisses un élément (média) dans Item2 du nœud Child2 lui même faisant parti du nœud Node 1, alors ta procédure retourne effectivement Node 1.

Mais comment tu sais si tu glisses dans item2 de child 2 ou item2 de child1 ?

La procédure aurait du te donner le parent directement au dessus c'est à dire Child 2 ou Child 1. Mais peut être que ça n'a pas d'importance pour ton projet :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par microdevweb »

@Falsam,

C'est parce que je voulais pouvoir choisir le niveau du parent
comme ça tu à le premier parent

Code : Tout sélectionner

Procedure GetParentTree(Parent,Id,TreeId)
      Protected Niv,N
      For N=Id To 0 Step -1
            Niv=GetGadgetItemAttribute(TreeId,N,#PB_Tree_SubLevel)
            If Niv=Parent
                  ProcedureReturn N
            EndIf
      Next
EndProcedure
Procedure DropTree()
     Niv=GetGadgetItemAttribute(0,GetGadgetState(0),#PB_Tree_SubLevel)
      If Niv>0
            Debug "Parent:"+GetGadgetItemText(0,GetParentTree(Niv-1,GetGadgetState(0),0))
      Else
            Debug "Je suis le premier parent"
      EndIf
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
TreeGadget(0,0,0,800,600)
AddGadgetItem(0,CountGadgetItems(0),"Node 1")
AddGadgetItem(0,CountGadgetItems(0),"Child 1",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Child 2",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Node 2")
AddGadgetItem(0,CountGadgetItems(0),"Child 1",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Child 2",0,1)
AddGadgetItem(0,CountGadgetItems(0),"Item 1",0,2)
AddGadgetItem(0,CountGadgetItems(0),"Item 2",0,2)
EnableGadgetDrop(0,#PB_Drop_Files,#PB_Drag_Copy)
BindEvent(#PB_Event_GadgetDrop,@DropTree(),0,0)
For N=0 To CountGadgetItems(0)-1
      SetGadgetItemState(0,N,#PB_Tree_Expanded)
Next
Repeat
      gEvent=WaitWindowEvent()
Until gEvent=#PB_Event_CloseWindow
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLUS] TreeGadget Récupérer ID parent

Message par falsam »

Merci microdevweb :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre