TreeGadget() redéfinir le sous-niveau ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

TreeGadget() redéfinir le sous-niveau ?

Message par Marc56 »

Hello,

Le gadget TreeGadget() permet de créer des sous-niveau lors de la création d'un élément (AddGadgetItem(#Gadget, Position, Texte$ [, ImageID [, Options]])) où Option = niveau par rapport à la branche supérieure.

Une fois l'abre créé, la fonction GetGadgetItemAttribute() utilisée avec l'attribut #PB_Tree_SubLevel: Renvoie le sous-niveau actuel de l'élément dans l'arbre.

Cependant, cette fonction n'a pas son équivalent (SetGadgetItemAttribute()) pour redéfinir le sous-niveau :|

Actuellement deux solutions (sans API)
- Supprimer l'élément puis le re-créer avec le nouveau niveau
- Redessiner tout l'arbre

Pourrait-on modifier SetGadgetItemAttribute() pour qu'il concerne aussi le TreeGadget ?

:|
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: TreeGadget() redéfinir le sous-niveau ?

Message par Micoute »

Bonjour Marc56, je ne sais plus de qui est ce programme source, mais il est très bien, je pense que c'est un code que j'ai "francisé".

Code : Tout sélectionner

Procedure.L Arbre(Action.L, Arbre.L, Clef.L, Racine.S)
  Reaction.L = 0
  ClefFinale.L = CountGadgetItems(Arbre) - 1
  If Action <= 5
    JeunesseClef.L = GetGadgetItemAttribute(Arbre, Clef, #PB_Tree_SubLevel)
    Select Action
    Case 0:  Clef = - 1: JeunesseClef = 0
    Case 1
      For i = Clef To 0 Step - 1
        Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
        If Jeunesse < JeunesseClef: Clef = i: i = 0
        ElseIf Jeunesse = 0: Clef = - 1: i = 0: EndIf
      Next i
    Case 2, 3, 5
      ClefFinale = CountGadgetItems(Arbre)
      For i = Clef + 1 To ClefFinale
        Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
        If Action = 5: If Jeunesse <= JeunesseClef: Clef = i - 1: i = ClefFinale: EndIf
        ElseIf Action = 2: If Jeunesse > JeunesseClef: Clef = i: EndIf
          If Jeunesse <= JeunesseClef: i = ClefFinale: EndIf
        Else: If Jeunesse => JeunesseClef: Clef = i: EndIf
          If Jeunesse < JeunesseClef: i = ClefFinale: EndIf
        EndIf
      Next
      If Action = 5: JeunesseClef + 1: EndIf
    Case 4: JeunesseClef + 1
    EndSelect
    AddGadgetItem(Arbre, Clef + 1, Racine, 0, JeunesseClef)
    If Action = 4 Or Action = 5: SetGadgetItemState(Arbre, Clef, #PB_Tree_Expanded): EndIf
  Else
    Select Action
    Case 8
      Reaction.L = CreateFile(#PB_Any, Racine)
      If Reaction <> 0
        For i = 0 To ClefFinale
          WriteLong(Reaction, GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel) )
          WriteStringN(Reaction, GetGadgetItemText(Arbre, i, - 1) )
        Next
      EndIf
    Case 9: Reaction = ReadFile(#PB_Any, Racine)
      If Reaction <> 0:  i = 0
        Repeat
          Level.L = ReadLong(Reaction)
          String.s = ReadString(Reaction)
          AddGadgetItem(Arbre, i, String, 0, Level): i + 1
        Until Eof(Reaction)
      EndIf
    EndSelect
    If IsFile(Reaction): CloseFile(Reaction): EndIf
    ProcedureReturn Reaction
  EndIf
EndProcedure

Global DSt.S = ""
DSt + "GFFGFFG8F0GDF68F0GBF68F770G4F7G1F8FG070G3F77FFF8FG078G4F7F888FG07866G3F77FFFG078"
DSt + "G06G3FG378F4G06G2FG278FFF4G06G2FG178G0F4G06G2FG078G1F4G06G2FG17G1F466G5FG07G1F46"
DSt + "GFF4GFFGFFGFFGFFG6FGBCFG09CG9ECFG09GBCF99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGB9FG"
DSt + "19G9B9FGF9FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7"
DSt + "FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9FG19G9B9FGF9F99GEF99FFGBCFG09CG9ECFG09GBCFF"
DSt + "7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9"
DSt + "FG19G9B9FGF9F99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGBCFG09CG9ECFG09GBCGFFFFGB9G1F9"
DSt + "G9B9G1FGB9G1F99GEF99FFFGACFG19CG8ECFG19GACFF7GFF7FFFGA7FFGE7FF7FFFGA7FF7GFF7FFFG"
DSt + "A7FFGE7FF7FFFGA7FF7GFF7FFFGA7FFGE7G2FGA7GFFFFGB9G1F9G9B9G1FGB9G1F99GEF99FFFGA7F9"
DSt + "9GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99F"
DSt + "FFGACFG19CG8ECFG19GACGFFFFG20G57000FFG20G170007G00FG20G170007G00FG20G170007G00FG"
DSt + "20G170007G00FG20G170007G00FG20G57G00FGF0F000G9F000F000G1F000G1F000F000G0F07F70G0"
DSt + "F000F000G0F7FF70G0F000F000G2F70G1F000F000G2F0G2F000F000G9F000F000G2F0G2F000F000G"
DSt + "2F7G2F000F0FGB0F0FGF0GFFGFFGFFGFFG6F00GDF0FF0GFFF0F0GEF00GDF000G6F000GCF0EEEG50G"
DSt + "3F0G7E0G3F0G7E0G3F0G7E0G3F0G0EG80FFF0EEE0G7E0FFF0EE0G7E0G0F0E0G7E0G1F00G7E0G2FG9"
DSt + "0GFFG4F"

Procedure.L ValHex(a.s)
  x = Asc(a): If x < 58: S = x - 48: Else: S = x - 55: EndIf: ProcedureReturn S
EndProcedure

Procedure RecupIco()
  Ico.S = ""
  For i = 1 To Len(DSt): A.S = Mid(DSt, i, 1)
    If A = "G": N.S = Mid(DSt, i + 1, 1)
      A = Mid(DSt, i + 2, 1): For j = 1 To 4 + ValHex(N): Ico + A: Next: i + 2
    Else: Ico + A
    EndIf
  Next: Adr = 0
  For ix = 0 To 7
    CreateImage(ix, 20, 20): StartDrawing(ImageOutput(ix) )
      For y = 0 To 19
        For x = 0 To 19
          Adr + 1: Pt = ValHex(Mid(Ico, Adr, 1))
          If Pt & 8: coef = 255: Else: coef = 128: EndIf
          R =((Pt & 4) >> 2) * coef: V =((Pt & 2) >> 1) * coef: B =((Pt & 1) ) * coef
          C = RGB(R, V, B): If Pt = 7: C = RGB(192, 192, 192): EndIf
          If Pt = 8: C = RGB(128, 128, 128): EndIf: Plot(x, y, C)
        Next
      Next
      StopDrawing()
    Next
EndProcedure

Procedure Enreg(Gadget)
  Repeat
    Repeat
      Name.S = SaveFileRequester("Enregistrer sous", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
      If Name = "": Goto ExitEnreg: EndIf
      If 0 Or FileSize(Name) = - 2: MessageRequester("Message", "Nom de fichier invalide !", 0): EndIf
    Until FileSize(Name) <> - 2
    If FileSize(Name) <> - 1
      Mess = MessageRequester("Message", "Le fichier " + Name + " existe déjà ! Voulez-vous l'écraser ?", #PB_MessageRequester_YesNoCancel)
      If Mess = #PB_MessageRequester_Cancel: Goto ExitEnreg: EndIf
    EndIf
  Until FileSize(Name) = - 1 Or Mess = #PB_MessageRequester_Yes
  Arbre(8, Gadget, 0, Name)
ExitEnreg:
EndProcedure

Procedure Charge(Gadget)
  Name.S = OpenFileRequester("Ouvrir", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
  If FileSize(Name) < 0
    MessageRequester("Message", "Nom de fichier incorrect ou inexistant !", 0)
  Else
    Arbre(9, Gadget, 0, Name)
  EndIf
EndProcedure

;************************************************************************
; PREPARATION MENU
;************************************************************************
  ; On récupère les icônes
  ;************************
  RecupIco()

  ; On crée la fenêtre du menu
  ;****************************
  OpenWindow(0, 10, 10, 28, 28 * 8, "x", #PB_Window_BorderLess)
  StickyWindow(0, 1)
  HideWindow(0, 1)

  ; On crée les boutons du menu
  ;******************************
  For i = 0 To 7
    ButtonImageGadget(i, 0, 28 * i, 28, 28, ImageID(i) )
  Next i
 
  ; On rajoute un peu d'aide
  ;**************************
  GadgetToolTip(0, "Détruire l'arbre")
  GadgetToolTip(1, "Crée une clé 'soeur ainée'")
  GadgetToolTip(2, "Crée une clé 'soeur cadette'")
  GadgetToolTip(3, "Crée une clé 'soeur benjamine'")
  GadgetToolTip(4, "Crée une clé 'enfant ainé'")
  GadgetToolTip(5, "Crée une clé 'enfant benjamin'")
  GadgetToolTip(6, "Enregistrer sous")
  GadgetToolTip(7, "Ouvrir")
;************************************************************************
;************************************************************************
 
 
;************************************************************************
;  PREPARATION FENETRE PRINCIPALE
;************************************************************************
  ; On crée la fenêtre
  ;********************
  OpenWindow(1, 0, 0, 400, 450, "Arbre", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
 
  ; On crée le TreeGadget
  ;***********************
  Global Gadget = TreeGadget(- 1, 0, 0, 400, 450, #PB_Tree_AlwaysShowSelection)
  LoadFont(0, "Verdana", 16, #PB_Font_Italic)
  SetGadgetFont(Gadget, FontID(0) )
 
  ; On crée un menu PopUp
  ;***********************
  CreatePopupMenu(0)
  MenuItem(0, "Renommer")
  MenuItem(1, "Supprimer")
 
  ; Derniers préparatifs
  ;**********************
  Arbre(0, Gadget, 0, "(vide)")
  SetGadgetState(Gadget, 0)
  ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
  HideWindow(0, 0)
 
;************************************************************************
;************************************************************************
 
 
 
 
 
  ; On fait une boucle d'événements
  ;*********************************
  Global Modified.L = 0
  Repeat
    Ev = WaitWindowEvent()
    Selected = GetGadgetState(Gadget)
    Select Ev
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(0, WindowID(1) )
    Case #PB_Event_Gadget
      Gadg = EventGadget()
      Select Gadg
      Case 0: Nouv = 0
        Arbre(0, Gadget, 0, "(vide_" + Str(Nouv) + ")"): Modified = 1
      Case 1, 2, 3, 4, 5
        ; If Selected <> -1
        ;  OldSelected = Selected
        Nouv + 1
        Arbre(Gadg, Gadget, Selected, "(vide_" + Str(Nouv) + ")"): Modified = 1
        ; Else
        ;  Selected = OldSelected
        ; EndIf
      Case 6
        Enreg(Gadget)
      Case 7
        Charge(Gadget)
      EndSelect
    Case #PB_Event_Menu
      Select EventMenu()
      Case 0
        SetGadgetItemText(Gadget, Selected, InputRequester("Renommer", "Entrez le nouveau nom :", GetGadgetItemText(Gadget, Selected, - 1) ), - 1 )
        Modified = 1
      Case 1
        If MessageRequester("Confirmer", "Voulez-vous réellement supprimer " + GetGadgetItemText(Gadget, Selected, - 1) + " ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
          RemoveGadgetItem(Gadget, Selected): Modified = 1
          If CountGadgetItems(Gadget) = 0
            Arbre(0, Gadget, 0, "(vide)")
          EndIf
        EndIf
      EndSelect
    Case #PB_Event_SizeWindow
      ResizeGadget(Gadget, 0, 0, WindowWidth(1), WindowHeight(1) )
    Case #PB_Event_MoveWindow
      ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
    Case #PB_Event_CloseWindow
      If Modified
        Mess = MessageRequester("Message", "Le document n'a pas été enregistré. Souhaitez-vous le faire maintenant ?", #PB_MessageRequester_YesNoCancel)
        Select Mess
          Case #PB_MessageRequester_Yes
            Enreg(Gadget)
          Case #PB_MessageRequester_No
            Quit = 1
        EndSelect
      Else
        Quit = 1
      EndIf
    EndSelect
  Until Quit = 1
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: TreeGadget() redéfinir le sous-niveau ?

Message par Zorro »

bon j'etais aussi dessus

voici une modification d'un code de Olivier
le menu contextuel (bouton droit de la souris ) , permet de creer des enfants,des freres, et .... de renommer ! :)

Code : Tout sélectionner

; code : Olivier
; Purebasic 4.10
#Gad_Tree = 0
#Menu_TreeEdit = 0
#ItemIns_Enfant = 0
#ItemIns_Frere = 1
#ItemSuppr = 2
#ItemProper = 3
If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		CreateGadgetList(WindowID(0) )   
		TreeGadget(#Gad_Tree, 10, 10, 340, 160)   
		AddGadgetItem(#Gad_Tree, 0, "Root", 0, 0)   
		;Boucle principale   
		CreatePopupMenu(#Menu_TreeEdit)
		OpenSubMenu("Ajouter")
		MenuItem(#ItemIns_Enfant, "Enfant")
		MenuItem(#ItemIns_Frere, "Frere")   
		CloseSubMenu()
		MenuItem(#ItemSuppr, "Enlever")
		MenuItem(#ItemProper, "Renommer")
Else
		End
EndIf
Repeat
		Select WaitWindowEvent()   
		Case #PB_Event_CloseWindow
				End   
		Case #WM_RBUTTONDOWN
				DisplayPopupMenu(0,WindowID(0))
		Case #PB_Event_Menu
				Select EventMenu()     
				Case #ItemIns_Enfant
						; On vérif qu'il y a une sélection /!\ Important : Merci Flype :)
						If GetGadgetState(#Gad_Tree) <> -1
								; On récup la sélection
								item = GetGadgetState(#Gad_Tree)
								; On récup alors le niveau de la sélection
								ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, item, #PB_Tree_SubLevel)
								; On mémorise le total: à 2 fois ça servira
								ExitFor = CountGadgetItems(#Gad_Tree)
								; On va rechercher l'enfant cadet
								For i = item + 1 To ExitFor
												TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel)
												; Dès qu'on trouve un frère, un tonton ou autre...
												If TestNiveau <= ItemNiveau
														; On signale que le cadet était juste avant
														item = i - 1
														; Et on arrête de chercher
														i = ExitFor
												EndIf
										Next i
										; On rajoute le bébé!
										AddGadgetItem(#Gad_Tree, item + 1, "Root"+ Str(n), 0, ItemNiveau + 1)
										; Et on ouvre la famille
										SetGadgetItemState(#Gad_Tree, item, #PB_Tree_Expanded)
										n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
								EndIf
						Case #ItemIns_Frere
								; On vérif qu'il y a une sélection
								If GetGadgetState(#Gad_Tree) <> -1
										; On récup la sélection
										item = GetGadgetState(#Gad_Tree)
										; On récup alors le niveau de la sélection
										ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, item, #PB_Tree_SubLevel)
										; On mémorise le total: à 2 fois ça servira
										ExitFor = CountGadgetItems(#Gad_Tree)
										; On va rechercher le dernier des descendants, neveux compris
										For i = item + 1 To ExitFor
														TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel)
														;Si c'est un frère, un fils, un neveu...
														If TestNiveau => ItemNiveau
																; On le mémorise au cas où ce soit le dernier
																item = i
														EndIf
														;Si c'est un tonton ou autre parent germain, recherche achevée
														If TestNiveau < ItemNiveau           
																i = ExitFor
														EndIf
												Next i
												; On insère le nouveau frère cadet
												AddGadgetItem(#Gad_Tree, item + 1, "Root"+Str(n), 0, ItemNiveau)
												n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
										EndIf
								Case #ItemSuppr
										If GetGadgetState(#Gad_Tree) <> -1
												; On récup la sélection
												item = GetGadgetState(#Gad_Tree)
												; On lui pete la gueule
												RemoveGadgetItem(#Gad_Tree, item)
												n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
										EndIf
								Case #ItemProper
										; by Zorro
										If GetGadgetState(#Gad_Tree) <> -1
												; On récup la sélection
												item = GetGadgetState(#Gad_Tree)		
												debug item
												ItemNiveau = GetGadgetItemAttribute(#Gad_Tree,item, #PB_Tree_SubLevel)
												debug ItemNiveau
												Resultat$ = GetGadgetItemText(#Gad_Tree,item )
												nouveau_nom$=InputRequester("entrez un nom","entrez un nom","Toto")
												SetGadgetItemText(#Gad_Tree, item, nouveau_nom$)
												
										EndIf
								EndSelect
						EndSelect
				ForEver
				
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: TreeGadget() redéfinir le sous-niveau ?

Message par Micoute »

Bonjour à toi aussi Zorro, je crois bien que le code que j'ai envoyé est du même auteur.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: TreeGadget() redéfinir le sous-niveau ?

Message par Zorro »

ben pour une fois qu'on lui rend homage, il va pas raler :mrgreen: :mrgreen: :lol: :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: TreeGadget() redéfinir le sous-niveau ?

Message par Marc56 »

Je remet ça up (2016) si jamais l'équipe cherche des petites finitions à faire au langage... 8)
https://www.purebasic.fr/french/viewtop ... 97#p187597

Pourquoi GetGadgetItemAttribute() n'a-t-il pas son opposé ? SetGadgetItemAttribute()

Même si la fonction ne redessine pas directement l'arbre, ce serait bien de pouvoir changer la valeur (#PB_Tree_SubLevel) directement.
Car c'est quand même un peu bidouille de devoir supprimer puis recréer un élément dans un Tree quand on veut simplement changer le niveau horizontal. (#PB_Tree_SubLevel). :?

Dans mon applis (en cours: treenote2 SQL), je créé un nouvel éléments, copie l'itemdata (qui me sert d'ID SQL), change le niveau, insère la nouvelle branche et supprime l'ancienne.
Avec un SetGadgetItemAttribute(), il suffirait de changer #PB_Tree_SubLevel puis redessiner tout l'arbre. :)

:?: :wink:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: TreeGadget() redéfinir le sous-niveau ?

Message par djes »

Alors là, je te soutiens totalement. Je trouve ce gadget hyper mal fichu, même si fonctionnel. Je pense que Fred n'a pas le temps de rentrer dans son détail, il faudrait que quelqu'un qui aime les IU se penche là-dessus pour nous pondre quelque chose de plus pratique et de plus complet. Le plus gros souci, c'est le multiplateformes.
Répondre