Gestion de prises de notes

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Gestion de prises de notes

Message par Micoute »

Bonjour à tous, pouvez-vous me dire pourquoi mon programme ne sauvegarder que la structure des données sans les textes ?

Je vous remercie par anticipation

Code : Tout sélectionner

EnableExplicit

Enumeration Fichiers
  #Fichier_Json
EndEnumeration

Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Arbre
  #Edt
  #Btn_Nouv_Dossier
  #Btn_Nouv_Note
  #Btn_Renommer
  #Btn_Supp_Note
  #Btn_Supp_Dossier
  #Btn_Charger
  #Btn_Sauvegarder
  #Btn_Quitter
  #Btn_Monter
  #Btn_Descendre
EndEnumeration

Enumeration Polices
  #police
EndEnumeration

Global.s Rep$ = GetPathPart(ProgramFilename()) : SetCurrentDirectory(Rep$)
Global Fichier_Notes.s = Rep$ + "Notes.Json"
Global NoeudSelectionne.i
Global NewList Notes.s()
Global NewList ContenuNotes.s()

LoadFont(#police, "Arial Nova", 12, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#police))

Procedure NoeudSelectionne()
  NoeudSelectionne = GetGadgetState(#Arbre)
EndProcedure

Procedure AjouterDossier()
  NoeudSelectionne()
  If NoeudSelectionne = -1
    AddGadgetItem(#Arbre, -1, "Nouveau dossier")
    AddElement(Notes())
    Notes() = "Nouveau dossier"
    AddElement(ContenuNotes())
    ContenuNotes() = ""
  Else
    AddGadgetItem(#Arbre, -1, "Nouveau dossier", 0, NoeudSelectionne)
    AddElement(Notes())
    Notes() = "Nouveau dossier"
    AddElement(ContenuNotes())
    ContenuNotes() = ""
  EndIf
EndProcedure

Procedure AjouterNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    AddGadgetItem(#Arbre, -1, "Nouvelle note", 0, NoeudSelectionne)
  Else
    AddGadgetItem(#Arbre, -1, "Nouvelle note")
  EndIf
  AddElement(Notes())
  Notes() = "Nouvelle note"
  AddElement(ContenuNotes())
  ContenuNotes() = ""
EndProcedure

Procedure RenommerNoeud()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    Protected nomNoeud$ = InputRequester("Renommer", "Entrez le nouveau nom :", GetGadgetItemText(#Arbre, NoeudSelectionne))
    If nomNoeud$ <> ""
      SetGadgetItemText(#Arbre, NoeudSelectionne, nomNoeud$)
      SelectElement(Notes(), NoeudSelectionne)
      Notes() = nomNoeud$
    EndIf
  EndIf
EndProcedure

Procedure ChargerContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    SelectElement(ContenuNotes(), NoeudSelectionne)
    SetGadgetText(#Edt, ContenuNotes())
  EndIf
EndProcedure

Procedure SauvegarderContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    SelectElement(ContenuNotes(), NoeudSelectionne)
    ContenuNotes() = GetGadgetText(#Edt)
  EndIf
EndProcedure

Procedure Supprimer_Note()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    RemoveGadgetItem(#Arbre, NoeudSelectionne)
    DeleteElement(Notes(), NoeudSelectionne)
    DeleteElement(ContenuNotes(), NoeudSelectionne)
  EndIf
EndProcedure

Procedure Supprimer_Dossier()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    RemoveGadgetItem(#Arbre, NoeudSelectionne)
    DeleteElement(Notes(), NoeudSelectionne)
    DeleteElement(ContenuNotes(), NoeudSelectionne)
  EndIf
EndProcedure

Procedure MonterNoeud()
  NoeudSelectionne()
  If NoeudSelectionne > 0
    Protected Texte$ = GetGadgetItemText(#Arbre, NoeudSelectionne)
    Protected Contenu$ = GetGadgetText(#Edt)
    
    ; Échanger les éléments dans les listes chaînées
    SelectElement(Notes(), NoeudSelectionne)
    Protected NoteTemp.s = Notes()
    SelectElement(Notes(), NoeudSelectionne - 1)
    Protected NoteTempPrec.s = Notes()
    Notes() = NoteTempPrec
    SelectElement(Notes(), NoeudSelectionne - 1)
    Notes() = NoteTemp

    SelectElement(ContenuNotes(), NoeudSelectionne)
    Protected ContenuTemp.s = ContenuNotes()
    SelectElement(ContenuNotes(), NoeudSelectionne - 1)
    Protected ContenuTempPrec.s = ContenuNotes()
    ContenuNotes() = ContenuTempPrec
    SelectElement(ContenuNotes(), NoeudSelectionne - 1)
    ContenuNotes() = ContenuTemp
    
    ; Mettre à jour l'arborescence
    SetGadgetItemText(#Arbre, NoeudSelectionne, GetGadgetItemText(#Arbre, NoeudSelectionne - 1))
    SetGadgetItemText(#Arbre, NoeudSelectionne - 1, Texte$)
    SetGadgetState(#Arbre, NoeudSelectionne - 1)
  EndIf
EndProcedure

Procedure DescendreNoeud()
  NoeudSelectionne()
  If NoeudSelectionne < CountGadgetItems(#Arbre) - 1
    Protected Texte$ = GetGadgetItemText(#Arbre, NoeudSelectionne)
    Protected Contenu$ = GetGadgetText(#Edt)

    ; Échanger les éléments dans les listes chaînées
    SelectElement(Notes(), NoeudSelectionne)
    Protected NoteTemp.s = Notes()
    SelectElement(Notes(), NoeudSelectionne + 1)
    Protected NoteTempsSuiv.s = Notes()
    Notes() = NoteTempsSuiv
    SelectElement(Notes(), NoeudSelectionne + 1)
    Notes() = NoteTemp

    SelectElement(ContenuNotes(), NoeudSelectionne)
    Protected ContenuTemp.s = ContenuNotes()
    SelectElement(ContenuNotes(), NoeudSelectionne + 1)
    Protected ContenuTempSuiv.s = ContenuNotes()
    ContenuNotes() = ContenuTempSuiv
    SelectElement(ContenuNotes(), NoeudSelectionne + 1)
    ContenuNotes() = ContenuTemp

    ; Mettre à jour l'arborescence
    SetGadgetItemText(#Arbre, NoeudSelectionne, GetGadgetItemText(#Arbre, NoeudSelectionne + 1))
    SetGadgetItemText(#Arbre, NoeudSelectionne + 1, Texte$)
    SetGadgetState(#Arbre, NoeudSelectionne + 1)
  EndIf
EndProcedure

Procedure GestionEvenementsArbre()
  Static dernierHeureClic.i
  Protected seuilDoubleClic.i = 500
  Protected HeureCourante.i = ElapsedMilliseconds()
  
  If EventType() = #PB_EventType_LeftClick
    If HeureCourante - dernierHeureClic <= seuilDoubleClic
      RenommerNoeud()
    Else
      ChargerContenuNote()
    EndIf
    dernierHeureClic = HeureCourante
  EndIf
EndProcedure

Procedure Sauvegarder()
  ; Création d'un objet JSON
  CreateJSON(#Fichier_Json)
  ; Insertion de la liste chaînée "Notes()" dans l'objet JSON
  InsertJSONList(JSONValue(#Fichier_Json), Notes())
  ; Insertion de la liste chaînée "ContenuNotes()" dans l'objet JSON
  InsertJSONList(JSONValue(#Fichier_Json), ContenuNotes())
  ; Sauvegarde du fichier
  SaveJSON(#Fichier_Json, Fichier_Notes, #PB_JSON_PrettyPrint)
EndProcedure

Procedure Charger()
  If FileSize(Fichier_Notes) > 0
    ; Lecture du fichier JSON
    LoadJSON(#Fichier_Json, Fichier_Notes)
    ; Extraction de la chaîne JSON vers la liste chaînée Notes()
    ExtractJSONList(JSONValue(#Fichier_Json), Notes())
    ; Extraction de la chaîne JSON vers la liste chaînée ContenuNotes()
    ExtractJSONList(JSONValue(#Fichier_Json), ContenuNotes())
    ; Affichage de la liste dans le TreeGadget
    ForEach Notes()
      AddGadgetItem(#Arbre, -1, Notes())
    Next
  EndIf
EndProcedure

Procedure Quitter()
  CloseWindow(#Fenetre_principale)
  End
EndProcedure

If OpenWindow(#Fenetre_principale, 100, 100, 650, 710, "Prise de notes", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(#Arbre, 10, 10, 310, 530)
  EditorGadget(#Edt, 330, 10, 310, 530)
  ButtonGadget(#Btn_Nouv_Dossier, 10, 550, 150, 30, "Nouveau dossier")
  ButtonGadget(#Btn_Nouv_Note, 170, 550, 150, 30, "Nouvelle note")
  
  ButtonGadget(#Btn_Renommer, 10, 630, 310, 30, "Renommer dossier ou note")
  ButtonGadget(#Btn_Supp_Note, 170, 590, 150, 30, "Supprimer note")
  
  ButtonGadget(#Btn_Supp_Dossier, 10, 590, 150, 30, "Supprimer dossier")
  
  ButtonGadget(#Btn_Charger, 490, 550, 150, 30, "Charger")
  ButtonGadget(#Btn_Sauvegarder, 490, 590, 150, 30, "Sauvegarder")
  ButtonGadget(#Btn_Quitter, 490, 670, 150, 30, "Quitter")
  ButtonGadget(#Btn_Monter, 10, 670, 150, 30, "Monter")
  ButtonGadget(#Btn_Descendre, 170, 670, 150, 30, "Descendre")
  
  ; Déclencheurs 
  BindGadgetEvent(#Arbre, @GestionEvenementsArbre()) 
  BindGadgetEvent(#Btn_Nouv_Dossier, @AjouterDossier()) 
  BindGadgetEvent(#Btn_Nouv_Note, @AjouterNote()) 
  BindGadgetEvent(#Btn_Renommer, @RenommerNoeud()) 
  BindGadgetEvent(#Btn_Supp_Note, @Supprimer_Note()) 
  BindGadgetEvent(#Btn_Supp_Dossier, @Supprimer_Dossier()) 
  BindGadgetEvent(#Btn_Charger, @Charger()) 
  BindGadgetEvent(#Btn_Sauvegarder, @Sauvegarder()) 
  BindGadgetEvent(#Btn_Quitter, @Quitter())
  BindGadgetEvent(#Btn_Monter, @MonterNoeud())
  BindGadgetEvent(#Btn_Descendre, @DescendreNoeud())
  
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Quitter() 
    EndSelect 
  ForEver 
EndIf
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Bruce33
Messages : 6
Inscription : dim. 10/sept./2023 14:02

Re: Gestion de prises de notes

Message par Bruce33 »

Bonjour,

Dans cette suite d'instructions :

Code : Tout sélectionner

  ; Insertion de la liste chaînée "Notes()" dans l'objet JSON
  InsertJSONList(JSONValue(#Fichier_Json), Notes())
  ; Insertion de la liste chaînée "ContenuNotes()" dans l'objet JSON
  InsertJSONList(JSONValue(#Fichier_Json), ContenuNotes())
la deuxième vient écraser le résultat de la première avec une liste ContenuNotes() qui est vide.
L'aide en ligne pour l'instruction InsertJSONList() indique : "Le contenu de la valeur sera remplacé par le contenu de la liste()."

Il faut d'abord bien comprendre le format JSON.
Je n'ai pas d'expérience dans ce domaine donc je ne vais pas m'aventurer à donner de mauvais conseils.
A priori il faut d'abord définir un objet, puis ajouter des membres.

C'est une erreur d'écrire

Code : Tout sélectionner

JSONValue(#Fichier_Json)
car ce n'est pas l'identifiant des données JSON (#Fichier_Json) qui devrait être donné mais celui de la valeur.
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Gestion de prises de notes

Message par Micoute »

J'ai toujours pratiqué de la sorte dans tous mes programmes où il y a une sauvegarde et ça fonctionne très bien.

Merci d'avoir pris le temps de regarder et de répondre.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Gestion de prises de notes

Message par Marc56 »

Bonjour Micoute,

Je n'aime pas trop le JSON, donc n'ai pas regardé à fond, mais ta procédure SauvegarderContenuNote() qui est la seule qui contient GetGadgetText() n'est appelée nulle part, donc le contenu texte n'est pas chargé dans les clés.

:wink:
Bruce33
Messages : 6
Inscription : dim. 10/sept./2023 14:02

Re: Gestion de prises de notes

Message par Bruce33 »

Désolé d'arriver de nulle part... :oops:
Observateur des forums Purebasic depuis des mois, je me suis décidé à intervenir pour progresser. J'ai testé le code source proposé comme un exercice.

Je ne nie pas que cela marche d'habitude mais le fichier obtenu avec le morceau de programme présenté (peut-être incomplet) ne crée pas un fichier JSON valide, juste un fragment. Ce qui n'empêche pas d'avoir un fonctionnement des enregistrements qui suffit au besoin.

Qu'est-ce qui semble incohérent dans mon analyse ?
En exécutant le programme, si je crée deux notes que je renomme "Note1" et "Note2" puis que je sauvegarde, j'obtiens le fichier Notes.Json suivant :

Code : Tout sélectionner

[
  "",
  ""
]
Si je mets en commentaire l'instruction InsertJSONList(JSONValue(#Fichier_Json), ContenuNotes()) dans la procédure Sauvegarder() et que j'exécute les mêmes manoeuvres, j'obtiens le fichier Notes.Json suivant :

Code : Tout sélectionner

[
  "Note1",
  "Note2"
]
Quelques essais dans des scripts indépendants m'ont confirmé que la deuxième instruction InsertJSONList() venait écraser la première.
Et comme le contenu des notes n'est pas sauvegardé (probablement lié au signalement de Marc56) la liste ContenuNotes() est composée de chaînes de caractères vides que l'on retrouve dans le premier résultat.

Je pensais que cela répondait à la question "pourquoi mon programme ne sauvegarde que la structure des données sans les textes ?" mais j'ai peut-être mal compris le souci...
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Gestion de prises de notes

Message par Marc56 »

Il faudrait que les listes Notes() et ContenuNotes() ne soient pas deux listes, mais un tableau à deux dimensions.
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Gestion de prises de notes

Message par Micoute »

Pourtant ça marche, mais j'ai du mal à trouver de bug.

Merci à tous d'avoir participé.

Code : Tout sélectionner

EnableExplicit

Enumeration Fichiers
  #Fichier_Json
EndEnumeration

Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Arbre
  #Edt
  #Btn_Nouv_Dossier
  #Btn_Nouv_Note
  #Btn_Renommer
  #Btn_Supp_Note
  #Btn_Supp_Dossier
  #Btn_Charger
  #Btn_Sauvegarder
  #Btn_Quitter
  #Btn_Monter
  #Btn_Descendre
EndEnumeration

Enumeration Polices
  #police
EndEnumeration

Global.s Rep$ = GetPathPart(ProgramFilename()) : SetCurrentDirectory(Rep$)
Global Fichier_Notes.s = Rep$ + "Notes.Json"
Global i, NoeudSelectionne.i
Global NewList Notes.s()
Global NewList ContenuNotes.s()

LoadFont(#police, "Arial Nova", 12, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#police))

Procedure NoeudSelectionne()
  NoeudSelectionne = GetGadgetState(#Arbre)
EndProcedure

Procedure SauvegarderContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    SelectElement(ContenuNotes(), NoeudSelectionne)
    SetGadgetText(#Edt, ContenuNotes())
    Debug "Contenu de la note sauvegardé : " + ContenuNotes()
  Else
    Debug "Aucun noeud sélectionné, rien à sauvegarder."
  EndIf
EndProcedure

Procedure AjouterDossier()
  SauvegarderContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne = -1
    AddGadgetItem(#Arbre, -1, "Nouveau dossier")
    AddElement(Notes())
    Notes() = "Nouveau dossier"
    AddElement(ContenuNotes())
    ContenuNotes() = ""
  Else
    AddGadgetItem(#Arbre, -1, "Nouveau dossier", 0, NoeudSelectionne)
    AddElement(Notes())
    Notes() = "Nouveau dossier"
    AddElement(ContenuNotes())
    ContenuNotes() = ""
  EndIf
EndProcedure

Procedure AjouterNote()
  SauvegarderContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    AddGadgetItem(#Arbre, -1, "Nouvelle note", 0, NoeudSelectionne)
  Else
    AddGadgetItem(#Arbre, -1, "Nouvelle note")
  EndIf
  AddElement(Notes())
  Notes() = "Nouvelle note"
  AddElement(ContenuNotes())
  ContenuNotes() = ""
EndProcedure

Procedure RenommerNoeud()
  SauvegarderContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    Protected nomNoeud$ = InputRequester("Renommer", "Entrez le nouveau nom :", GetGadgetItemText(#Arbre, NoeudSelectionne))
    If nomNoeud$ <> ""
      SetGadgetItemText(#Arbre, NoeudSelectionne, nomNoeud$)
      SelectElement(Notes(), NoeudSelectionne)
      Notes() = nomNoeud$
    EndIf
  EndIf
EndProcedure

Procedure ChargerContenuNote()
  SauvegarderContenuNote()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    SelectElement(ContenuNotes(), NoeudSelectionne)
    SetGadgetText(#Edt, ContenuNotes())
  EndIf
EndProcedure

Procedure Supprimer_Note()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    RemoveGadgetItem(#Arbre, NoeudSelectionne)
    DeleteElement(Notes(), NoeudSelectionne)
    DeleteElement(ContenuNotes(), NoeudSelectionne)
  EndIf
EndProcedure

Procedure Supprimer_Dossier()
  NoeudSelectionne()
  If NoeudSelectionne <> -1
    RemoveGadgetItem(#Arbre, NoeudSelectionne)
    DeleteElement(Notes(), NoeudSelectionne)
    DeleteElement(ContenuNotes(), NoeudSelectionne)
  EndIf
EndProcedure

Procedure MonterNoeud()
  NoeudSelectionne()
  If NoeudSelectionne > 0
    Protected Texte$ = GetGadgetItemText(#Arbre, NoeudSelectionne)
    Protected Contenu$ = GetGadgetText(#Edt)
    
    ; Échanger les éléments dans les listes chaînées
    SelectElement(Notes(), NoeudSelectionne)
    Protected NoteTemp.s = Notes()
    SelectElement(Notes(), NoeudSelectionne - 1)
    Protected NoteTempPrec.s = Notes()
    Notes() = NoteTempPrec
    SelectElement(Notes(), NoeudSelectionne - 1)
    Notes() = NoteTemp

    SelectElement(ContenuNotes(), NoeudSelectionne)
    Protected ContenuTemp.s = ContenuNotes()
    SelectElement(ContenuNotes(), NoeudSelectionne - 1)
    Protected ContenuTempPrec.s = ContenuNotes()
    ContenuNotes() = ContenuTempPrec
    SelectElement(ContenuNotes(), NoeudSelectionne - 1)
    ContenuNotes() = ContenuTemp
    
    ; Mettre à jour l'arborescence
    SetGadgetItemText(#Arbre, NoeudSelectionne, GetGadgetItemText(#Arbre, NoeudSelectionne - 1))
    SetGadgetItemText(#Arbre, NoeudSelectionne - 1, Texte$)
    SetGadgetState(#Arbre, NoeudSelectionne - 1)
  EndIf
EndProcedure

Procedure DescendreNoeud()
  NoeudSelectionne()
  If NoeudSelectionne < CountGadgetItems(#Arbre) - 1
    Protected Texte$ = GetGadgetItemText(#Arbre, NoeudSelectionne)
    Protected Contenu$ = GetGadgetText(#Edt)

    ; Échanger les éléments dans les listes chaînées
    SelectElement(Notes(), NoeudSelectionne)
    Protected NoteTemp.s = Notes()
    SelectElement(Notes(), NoeudSelectionne + 1)
    Protected NoteTempsSuiv.s = Notes()
    Notes() = NoteTempsSuiv
    SelectElement(Notes(), NoeudSelectionne + 1)
    Notes() = NoteTemp

    SelectElement(ContenuNotes(), NoeudSelectionne)
    Protected ContenuTemp.s = ContenuNotes()
    SelectElement(ContenuNotes(), NoeudSelectionne + 1)
    Protected ContenuTempSuiv.s = ContenuNotes()
    ContenuNotes() = ContenuTempSuiv
    SelectElement(ContenuNotes(), NoeudSelectionne + 1)
    ContenuNotes() = ContenuTemp

    ; Mettre à jour l'arborescence
    SetGadgetItemText(#Arbre, NoeudSelectionne, GetGadgetItemText(#Arbre, NoeudSelectionne + 1))
    SetGadgetItemText(#Arbre, NoeudSelectionne + 1, Texte$)
    SetGadgetState(#Arbre, NoeudSelectionne + 1)
  EndIf
EndProcedure

Procedure GestionEvenementsArbre()
  Static dernierHeureClic.i
  Protected seuilDoubleClic.i = 500
  Protected HeureCourante.i = ElapsedMilliseconds()
  
  If EventType() = #PB_EventType_LeftClick
    If HeureCourante - dernierHeureClic <= seuilDoubleClic
      RenommerNoeud()
    Else
      ChargerContenuNote()
    EndIf
    dernierHeureClic = HeureCourante
  EndIf
EndProcedure

Procedure Sauvegarder()
  SauvegarderContenuNote() ; Sauvegarde le contenu actuel avant de sauvegarder dans le fichier JSON

  ; Création d'un objet JSON
  CreateJSON(#Fichier_Json)
  Protected root = SetJSONObject(JSONValue(#Fichier_Json))
  
  ; Création des tableaux JSON pour les notes et le contenu
  Protected notesArray = SetJSONArray(AddJSONMember(root, "Notes"))
  Protected contenuArray = SetJSONArray(AddJSONMember(root, "ContenuNotes"))
  
  ; Insertion des éléments dans les tableaux JSON
  ForEach Notes()
    Protected noteElement = AddJSONElement(notesArray)
    SetJSONString(noteElement, Notes())
  Next
  
  ForEach ContenuNotes()
    Protected contenuElement = AddJSONElement(contenuArray)
    SetJSONString(contenuElement, ContenuNotes())
  Next
  
  ; Sauvegarde du fichier JSON
  If SaveJSON(#Fichier_Json, Fichier_Notes, #PB_JSON_PrettyPrint)
    Debug "Sauvegarde du fichier JSON réussie."
  Else
    Debug "Erreur lors de la sauvegarde du fichier JSON."
  EndIf
EndProcedure


Procedure Charger()
  If FileSize(Fichier_Notes) > 0
    Debug "Taille du fichier JSON valide."
    ; Lecture du fichier JSON
    If LoadJSON(#Fichier_Json, Fichier_Notes)
      Debug "Chargement du fichier JSON réussi."
      ; Vider les listes actuelles
      ClearList(Notes())
      ClearList(ContenuNotes())
      
      ; Extraire les listes chaînées depuis le JSON
      Protected Root = JSONValue(#Fichier_Json)
      If JSONType(Root) = #PB_JSON_Object
        Debug "Racine JSON est un objet valide."
        
        ; Extraire le tableau "Notes"
        Protected NotesArray = GetJSONMember(Root, "Notes")
        If JSONType(NotesArray) = #PB_JSON_Array
          Debug "Tableau Notes trouvé."
          For i = 0 To JSONArraySize(NotesArray) - 1
            AddElement(Notes())
            Notes() = GetJSONString(GetJSONElement(NotesArray, i))
            Debug "Note ajoutée : " + Notes()
          Next
        Else
          Debug "Erreur : Tableau Notes introuvable ou invalide."
        EndIf
        
        ; Extraire le tableau "ContenuNotes"
        Protected ContenuArray = GetJSONMember(Root, "ContenuNotes")
        If JSONType(ContenuArray) = #PB_JSON_Array
          Debug "Tableau ContenuNotes trouvé."
          For i = 0 To JSONArraySize(ContenuArray) - 1
            AddElement(ContenuNotes())
            ContenuNotes() = GetJSONString(GetJSONElement(ContenuArray, i))
            Debug "Contenu de note ajouté : " + ContenuNotes()
          Next
        Else
          Debug "Erreur : Tableau ContenuNotes introuvable ou invalide."
        EndIf
        
      Else
        Debug "Erreur : Racine JSON non valide ou introuvable."
      EndIf
      
      ; Mise à jour de l'arborescence
      ClearGadgetItems(#Arbre)
      ForEach Notes()
        AddGadgetItem(#Arbre, -1, Notes())
      Next
      
      ; Mettre à jour le gadget éditeur avec le contenu de la première note
      If FirstElement(ContenuNotes())
        SetGadgetText(#Edt, ContenuNotes())
      EndIf
      
    Else
      Debug "Erreur lors du chargement du fichier JSON."
      MessageRequester("Erreur", "Erreur lors du chargement du fichier JSON.")
    EndIf
  Else
    Debug "Erreur : Le fichier JSON est vide ou introuvable."
  EndIf
EndProcedure


Procedure Quitter()
  CloseWindow(#Fenetre_principale)
  End
EndProcedure

If OpenWindow(#Fenetre_principale, 100, 100, 650, 710, "Prise de notes", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(#Arbre, 10, 10, 310, 530)
  EditorGadget(#Edt, 330, 10, 310, 530)
  ButtonGadget(#Btn_Nouv_Dossier, 10, 550, 150, 30, "Nouveau dossier")
  ButtonGadget(#Btn_Nouv_Note, 170, 550, 150, 30, "Nouvelle note")
  
  ButtonGadget(#Btn_Renommer, 10, 630, 310, 30, "Renommer dossier ou note")
  ButtonGadget(#Btn_Supp_Note, 170, 590, 150, 30, "Supprimer note")
  
  ButtonGadget(#Btn_Supp_Dossier, 10, 590, 150, 30, "Supprimer dossier")
  
  ButtonGadget(#Btn_Charger, 490, 550, 150, 30, "Charger")
  ButtonGadget(#Btn_Sauvegarder, 490, 590, 150, 30, "Sauvegarder")
  ButtonGadget(#Btn_Quitter, 490, 670, 150, 30, "Quitter")
  ButtonGadget(#Btn_Monter, 10, 670, 150, 30, "Monter")
  ButtonGadget(#Btn_Descendre, 170, 670, 150, 30, "Descendre")
  
  ; Déclencheurs 
  BindGadgetEvent(#Arbre, @GestionEvenementsArbre()) 
  BindGadgetEvent(#Btn_Nouv_Dossier, @AjouterDossier()) 
  BindGadgetEvent(#Btn_Nouv_Note, @AjouterNote()) 
  BindGadgetEvent(#Btn_Renommer, @RenommerNoeud()) 
  BindGadgetEvent(#Btn_Supp_Note, @Supprimer_Note()) 
  BindGadgetEvent(#Btn_Supp_Dossier, @Supprimer_Dossier()) 
  BindGadgetEvent(#Btn_Charger, @Charger()) 
  BindGadgetEvent(#Btn_Sauvegarder, @Sauvegarder()) 
  BindGadgetEvent(#Btn_Quitter, @Quitter())
  BindGadgetEvent(#Btn_Monter, @MonterNoeud())
  BindGadgetEvent(#Btn_Descendre, @DescendreNoeud())
  
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Quitter() 
    EndSelect 
  ForEver 
EndIf
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre