Page 1 sur 1

PanelGadget() + EditorGadget() mode Dynamique

Publié : ven. 13/sept./2024 16:59
par Jacobus
Bonjour tout le monde, je vous mets ça là si à tout hasard vous en avez l'utilité.
Comme c'est le genre de chose que l'on aimerait trouver sans se prendre la tête, maintenant c'est fait.
C'est free, c'est du tout cuit. Rien ne vous empêche de faire mieux...

Code : Tout sélectionner

;===========================
; Comment gérer des gadgets dynamiques
; et récupérer le contenu des éditeurs, un peu comme l'IDE de PB
; PanelGadget() + EditorGadget()
;=--------------------------
; Codé avec PB V6.12 LTS
; by Jacobus le 13/09/2024
; Freely use comme tu veux, ça peut servir.
;=--------------------------
;J'ai passé l'après-midi la-dessus. 
;après avoir testé avec des 'Dim' et des 'Structures'
;J'ai trouvé que cette solution était la plus simple
;Maintenant à chacun de voir ce qu'il en fait, en mieux ou pas.
;===========================
Enumeration
  #WinDyn
  #btnDebug
  #btnClose
  #btnNew
  #btnList
  #Panel
EndEnumeration

Global n = 0 ;(pas indispensable, juste un marqueur pour l'exemple)
Global NewList NewEditor()   ; création d'une liste qui va recevoir les éditeurs en dynamique et avec laquelle on va pouvoir les gérer facilement
;-Fenêtre
If OpenWindow(#WinDyn,0,0, 400, 400,"Panel + Editor, mode dynamique", #PB_Window_SystemMenu |#PB_Window_ScreenCentered |#PB_Window_TitleBar)=0 
  End
EndIf
ButtonGadget(#btnDebug,5,5,100,25,"Contrôle") : GadgetToolTip(#btnDebug,"Récupère le texte de l'éditeur courant et l'affiche dans 'MainEditor'")
ButtonGadget(#btnClose,105,5,100,25,"Fermer") : GadgetToolTip(#btnClose,"Ferme l'onglet courant et supprime l'éditeur de la liste")
ButtonGadget(#btnNew,205,5,100,25,"Nouveau")  : GadgetToolTip(#btnNew,"Ajoute un nouvel onglet et son éditeur")
ButtonGadget(#btnList,305,5,90,25,"Liste")    : GadgetToolTip(#btnList,"Affiche la liste des n° d'éditeurs créés et disponibles dans la 'NewEditor()'")
PanelGadget(#Panel,0,35,400,150)
AddGadgetItem(#Panel, -1, "Onglet-"+Str(n))                       ;Création premier onglet avec marqueur/numéroteur
NEditor = EditorGadget(#PB_Any,10,10,380,100,#PB_Editor_WordWrap) ;Création premier éditeur
AddElement(NewEditor()) : NewEditor() = NEditor : n+1             ;Ajout du nouveau gadget à la liste (n+1 ne sert qu'à la numérotation des onglets)
SetGadgetColor(NEditor, #PB_Gadget_BackColor, RGB(255, 250, 205)) ;Fond de couleur de l'éditeur
SetActiveGadget(NEditor)                                          ;Activation de l'éditeur (focus)
CloseGadgetList()
;Editeur de contrôle
MainEditor = EditorGadget(#PB_Any,10,190,380,200,#PB_Editor_WordWrap)
;-Boucle d'évènements
Repeat
  Event = WaitWindowEvent()  
  If Event = #PB_Event_Gadget    
    Select EventGadget()       
      Case #btnDebug ;{ 
        ; juste une vérification mais peut être utilisé pour enregistrer le contenu de l'éditeur dans un fichier texte
        panel = GetGadgetState(#Panel)
        For i = 0 To ListSize(NewEditor())-1
          If i = panel
            *Element = SelectElement(NewEditor(), i) 
            ;Ajoute les données dans l'éditeur de contrôle sous le panel
            ;pour vérifier que tout est bien récupéré du bon onglet et du bon éditeur
            AddGadgetItem(MainEditor,-1,"Onglet n° : "+ Str(panel))
            AddGadgetItem(MainEditor,-1,"Editeur n° : "+Str(NewEditor()))
            AddGadgetItem(MainEditor,-1,"Texte = "+GetGadgetText(NewEditor()))
            AddGadgetItem(MainEditor,-1,"----------------------------------------")
          EndIf                   
        Next        
        ;}       
      Case #btnNew ;{
     ;(ajoute un nouvel onglet contenant un nouvel éditeur)
        OpenGadgetList(#Panel)
          AddGadgetItem (#Panel, -1, "Onglet-"+Str(n))       
          NEditor = EditorGadget(#PB_Any,10,10,380,100,#PB_Editor_WordWrap)
          AddElement(NewEditor()) : NewEditor() = NEditor : n+1  ; Ajout du nouveau gadget à la liste (n+1 ne sert qu'à la numérotation des onglets)
          SetGadgetColor(NEditor, #PB_Gadget_BackColor, RGB(255, 250, 205))
          SetGadgetState(#Panel,GetGadgetState(#Panel)+1) ; on affiche le nouvel élément du panel
          SetActiveGadget(NEditor) ;on active le nouvel éditeur              
        CloseGadgetList()
        ;         Debug Str(NEditor)
        ;         Debug "Il y a "+Str(ListSize(NewEditor()))+" éléments dans la liste"
        ;         Debug "==========================="
        ;}
      Case #btnClose ;{ 
       ;(ferme l'onglet actif et supprime l'éditeur de la liste sauf le premier ou '0')       
        panelitem = GetGadgetState(#Panel)
        nbitems   = CountGadgetItems(#Panel) : Debug Str(nbitems)
        PreviousItem = GetGadgetState(#Panel)-1       
        If nbitems > 1  ; s'il y a plusieurs onglets ouverts      
            For i = 0 To ListSize(NewEditor())-1 
              If i = panelitem And panelitem <> 0
                *Element = SelectElement(NewEditor(), i) 
                DeleteElement(NewEditor(), i) ; supprime l'éditeur correspondant de la liste
                RemoveGadgetItem(#Panel, panelitem)
                SetGadgetState(#Panel,PreviousItem) ;permet de sélectionner l'onglet juste avant celui qui a été supprimé
              ElseIf i = panelitem And panelitem = 0 ; si l'onglet est le premier on le garde.
                *Element = SelectElement(NewEditor(), i)
                ClearGadgetItems(NewEditor()) ; nettoie l'éditeur du texte contenu mais le conserve
                SetGadgetItemText(#Panel, panelitem, "<Nouveau>") ; renomme l'onglet
              EndIf 
            Next                  
        ElseIf nbitems = 1 ; s'il n'y a qu'un seul onglet ouvert on le garde        
            panelitem = GetGadgetState(#Panel)            
            For i = 0 To ListSize(NewEditor())-1 
              If i = panelitem And panelitem = 0
                *Element = SelectElement(NewEditor(), i)
                ClearGadgetItems(NewEditor())
                SetGadgetItemText(#Panel, panelitem, "<Nouveau>")
              EndIf 
            Next            
        EndIf 
          ;}        
      Case #btnList ;{
    ;(juste pour voir les n° des EditorGadget() créés dans la liste...)     
        For i = 0 To ListSize(NewEditor())-1 
          SelectElement(NewEditor(), i)
          Debug "Au PanelItem "+Str(i)+", l'éditeur est le n° "+Str(NewEditor())
        Next          
        ;}      
    EndSelect   
  EndIf
Until Event= #PB_Event_CloseWindow         
End
;Si pour tester vous avez la flemme de taper du texte, utilisez 'Ctrl+c' pour copier un texte et 'Ctrl+v' pour le coller dans l'éditeur actif. 
Salut les codeurs.

Re: PanelGadget() + EditorGadget() mode Dynamique

Publié : sam. 14/sept./2024 17:14
par Jacobus
J'ai apporté une modification au code (fonction du bouton #btnClose) en raison d'un plantage lors de la fermeture des onglets. En effet, si on fermait le premier (l'élément 0), l'éditeur attribué n'était plus initialisé. Avec la modification en fermant le premier onglet celui-ci est conservé et réinitialisé en <nouveau> ce qui supprime tout plantage. L'occasion d'utiliser PB v6.12LTS. Voilà c'est mieux :)

Re: PanelGadget() + EditorGadget() mode Dynamique

Publié : dim. 22/sept./2024 13:12
par Micoute
Merci Jacobus, c'est merveilleusement fait.

Re: PanelGadget() + EditorGadget() mode Dynamique

Publié : mer. 25/sept./2024 18:55
par Kwai chang caine
Jolie fonction et surement utile à l'avenir
Marche bien ici, merci pour le partage 8)