Je voudrais créer un logiciel pour prendre des notes

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

Je voudrais créer un logiciel pour prendre des notes

Message par Micoute »

Bonsoir à tous,

je souhaite faire un logiciel pour prendre toutes sortes de notes, avec comme gadgets principaux un TreeGadget , un EditorGadget et un SplitterGadget, mais le comportement de ce dernier me cause des problèmes quand je veux redimensionner la fenêtre principale, peut-être devrais-je utiliser un container et adapter mes deux gadgets aux dimensions de ce container ?

Je souhaiterais aussi, mais je n'en suis pas encore là que le TreeGadget sélectionne une note dans l'EditorGadget quand on clique sur son titre.

Ne voyant pas la solution, je me suis permis de solliciter vos aide judicieuse et je vous remercie à l'avance pour votre soutient.
Dernière modification par Micoute le sam. 01/oct./2016 10:22, modifié 1 fois.
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 : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Message par Marc56 »

Avec le VD tu fais ça en moins d'une minute.
  • Créé les deux gadgets (tree et editor)
  • Ancres-les (gauche haut et bas pour le tree, droite, haut et bas pour l'editeur)
  • Entoure le tout avec le splitter
  • Sélectionne les deux gadgets dans la fenêtre qui s'ouvre alors.
  • Change l'orientation du splitter (coche vertical dans les options)
  • Quand tu coche le type de fenêtre (#PB_Window_SizeGadget) le VD créé tout seul la procédure de resize
Ce qui donne:

Splitter.pbf (aucune modification manuelle n'a été effectuée)

Code : Tout sélectionner

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #Tree_0
  #Editor_0
  #Splitter_0
  #Btn_Quit
EndEnumeration

Declare ResizeGadgetsWindow_0()


Procedure OpenWindow_0(x = 0, y = 0, width = 600, height = 400)
  OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  TreeGadget(#Tree_0, 10, 15, 177, 340)
  EditorGadget(#Editor_0, 196, 15, 394, 340)
  SplitterGadget(#Splitter_0, 10, 15, 580, 340, #Tree_0, #Editor_0, #PB_Splitter_Vertical)
  SetGadgetState(#Splitter_0, 177)
  ButtonGadget(#Btn_Quit, 485, 365, 100, 25, "Quitter")
EndProcedure

Procedure ResizeGadgetsWindow_0()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_0)
  FormWindowHeight = WindowHeight(#Window_0)
  ResizeGadget(#Tree_0, 10, 15, 177, FormWindowHeight - 60)
  ResizeGadget(#Editor_0, FormWindowWidth - 404, 15, 394, FormWindowHeight - 60)
  ResizeGadget(#Splitter_0, 10, 15, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Btn_Quit, GadgetWidth(#Splitter_0) - 95, GadgetHeight(#Splitter_0) - -25, 100, 25)
EndProcedure
Il ne te reste plus qu'à créer le code principal.

Splitter.pb

Code : Tout sélectionner

XIncludeFile "Splitter.pbf"

OpenWindow_0()

Repeat
    Select WaitWindowEvent()

        Case #PB_Event_CloseWindow
            Break
            
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Btn_Quit
                    Break   
            EndSelect
            
        Case #PB_Event_SizeWindow
            ResizeGadgetsWindow_0()
            
    EndSelect
ForEver
(et encore, on peut simplifier et laisser le VD générer la procédure d’évènement principale de chaque gadget)
8)
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Message par Mesa »

C'est plus facile à faire en remplaçant l'EditorGadget par le ListViewGadget.
Sinon avec l'EditorGadget, il faut utiliser les apis.
J'ai mis les deux codes, ci-dessous.

ListViewGadget

Code : Tout sélectionner

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #Tree_0
  #Editor_0
  #Splitter_0
  #Btn_Quit
EndEnumeration

Declare ResizeGadgetsWindow_0()


Procedure OpenWindow_0(x = 0, y = 0, width = 600, height = 400)
  OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  TreeGadget(#Tree_0, 10, 15, 177, 340)
  ListViewGadget(#Editor_0, 196, 15, 394, 340);EditorGadget(#Editor_0, 196, 15, 394, 340)
  SplitterGadget(#Splitter_0, 10, 15, 580, 340, #Tree_0, #Editor_0, #PB_Splitter_Vertical)
  SetGadgetState(#Splitter_0, 177)
  ButtonGadget(#Btn_Quit, 485, 365, 100, 25, "Quitter")
EndProcedure

Procedure ResizeGadgetsWindow_0()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_0)
  FormWindowHeight = WindowHeight(#Window_0)
  ResizeGadget(#Tree_0, 10, 15, 177, FormWindowHeight - 60)
  ResizeGadget(#Editor_0, FormWindowWidth - 404, 15, 394, FormWindowHeight - 60)
  ResizeGadget(#Splitter_0, 10, 15, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Btn_Quit, GadgetWidth(#Splitter_0) - 95, GadgetHeight(#Splitter_0) - -25, 100, 25)
EndProcedure
;XIncludeFile "Splitter.pbf"

OpenWindow_0()

For ID = #Tree_0 To #Editor_0
  For a = 0 To 10
    AddGadgetItem(ID, -1, "Elément normal "+Str(a), 0, 0) ; si vous souhaitez ajouter une image, utilisez 
    AddGadgetItem(ID, -1, "Noeud "+Str(a), 0, 0)          ; ImageID(x) comme 4ème paramètre
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-1", 0, 1)         ; Ceux-là sont au premier sous-niveau 
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-2", 0, 1)
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-3", 0, 1)
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-4", 0, 1)
    AddGadgetItem(ID, -1, "Fichier "+Str(a), 0, 0) ; sous-niveau 0 à nouveau
  Next
Next


Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Btn_Quit
          Break 
        Case #Tree_0
          Select EventType()
            Case #PB_EventType_Change
              texte$= GetGadgetText(#Tree_0)
              ;Debug texte$
              For i=0 To CountGadgetItems(#Editor_0) - 1
                If texte$=GetGadgetItemText(#Editor_0,i)
                  SetGadgetState(#Editor_0, i)
                  Break
                EndIf
              Next i
          EndSelect
      EndSelect
      
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_0()
      
  EndSelect
ForEver
EditorGadget

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
  CompilerIf #PB_Compiler_Version < 500 Or (#PB_Compiler_Version >= 500 And Subsystem("Carbon"))
    ImportC ""
      GetControlProperty(ControlRef.L, PropertyCreator.L, PropertyTag.L, BufferSize.L, *ActualSize, *PropertyBuffer)
      TXNSetSelection(TXNObject.L, StartOffset.L, EndOffset.L)
      TXNShowSelection(TXNObject.L, ShowEnd.L)
    EndImport
  CompilerEndIf
CompilerEndIf

Procedure SelectEditorLine(EditorID.I, LineNumber.I)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected EndOfLine.GtkTextIter
      Protected StartOfLine.GtkTextIter
      Protected *TextBuffer.GtkTextBuffer
      
      *TextBuffer = gtk_text_view_get_buffer_(GadgetID(EditorID))
      gtk_text_buffer_get_iter_at_line_(*TextBuffer, @StartOfLine, LineNumber)
      gtk_text_view_scroll_to_iter_(GadgetID(EditorID), StartOfLine, 0.0, #False, 0.0, 0.0)
      EndOfLine = StartOfLine
      gtk_text_iter_forward_to_line_end_(EndOfLine)
      gtk_text_buffer_select_range_(*TextBuffer, StartOfLine, EndOfLine)
    CompilerCase #PB_OS_MacOS
      CompilerIf #PB_Compiler_Version < 470 Or (#PB_Compiler_Version >= 500 And Subsystem("Carbon"))
        Protected EndOfLine.L
        Protected StartOfLine.L
        Protected TXNObject.L
        
        If GetControlProperty(GadgetID(EditorID), $50555245, $54584F42, 4, 0, @TXNObject) = 0
          StartOfLine = FindString(GetGadgetText(EditorID), GetGadgetItemText(EditorID, LineNumber)) - 1
          EndOfLine = StartOfLine + Len(GetGadgetItemText(EditorID, LineNumber))
          TXNSetSelection(TXNObject, StartOfLine, EndOfLine)
          TXNShowSelection(TXNObject, #True)
        EndIf
      CompilerElse
        Protected Range.NSRange
        
        Range\location = FindString(GetGadgetText(EditorID), GetGadgetItemText(EditorID, LineNumber)) - 1
        Range\length = Len(GetGadgetItemText(EditorID, LineNumber))
        CocoaMessage(0, GadgetID(EditorID), "setSelectedRange:@", @Range)
        CocoaMessage(0, GadgetID(EditorID), "scrollRangeToVisible:@", @Range)
      CompilerEndIf
    CompilerCase #PB_OS_Windows
      Protected Selection.CHARRANGE
      Protected StartOfLine.I
      
      StartOfLine = SendMessage_(GadgetID(EditorID), #EM_LINEINDEX, LineNumber, 0)
      Selection.CHARRANGE\cpMin = StartOfLine
      Selection.CHARRANGE\cpMax = StartOfLine + Len(GetGadgetItemText(EditorID, LineNumber)) + 1
      SendMessage_(GadgetID(EditorID), #EM_EXSETSEL, 0, @Selection)
  CompilerEndSelect
EndProcedure
;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #Tree_0
  #Editor_0
  #Splitter_0
  #Btn_Quit
EndEnumeration

Declare ResizeGadgetsWindow_0()


Procedure OpenWindow_0(x = 0, y = 0, width = 600, height = 400)
  OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  TreeGadget(#Tree_0, 10, 15, 177, 340)
  EditorGadget(#Editor_0, 196, 15, 394, 340)
  SplitterGadget(#Splitter_0, 10, 15, 580, 340, #Tree_0, #Editor_0, #PB_Splitter_Vertical)
  SetGadgetState(#Splitter_0, 177)
  ButtonGadget(#Btn_Quit, 485, 365, 100, 25, "Quitter")
EndProcedure

Procedure ResizeGadgetsWindow_0()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_0)
  FormWindowHeight = WindowHeight(#Window_0)
  ResizeGadget(#Tree_0, 10, 15, 177, FormWindowHeight - 60)
  ResizeGadget(#Editor_0, FormWindowWidth - 404, 15, 394, FormWindowHeight - 60)
  ResizeGadget(#Splitter_0, 10, 15, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Btn_Quit, GadgetWidth(#Splitter_0) - 95, GadgetHeight(#Splitter_0) - -25, 100, 25)
EndProcedure
;XIncludeFile "Splitter.pbf"

OpenWindow_0()

For ID = #Tree_0 To #Editor_0
  For a = 0 To 10
    AddGadgetItem(ID, -1, "Elément normal "+Str(a), 0, 0) ; si vous souhaitez ajouter une image, utilisez 
    AddGadgetItem(ID, -1, "Noeud "+Str(a), 0, 0)          ; ImageID(x) comme 4ème paramètre
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-1", 0, 1)         ; Ceux-là sont au premier sous-niveau 
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-2", 0, 1)
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-3", 0, 1)
    AddGadgetItem(ID, -1, "Sous-élément " + Str(a) + "-4", 0, 1)
    AddGadgetItem(ID, -1, "Fichier "+Str(a), 0, 0) ; sous-niveau 0 à nouveau
  Next
Next


Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Btn_Quit
          Break 
        Case #Tree_0
          Select EventType()
            Case #PB_EventType_Change
              texte$= GetGadgetText(#Tree_0)
              ;Debug texte$
              For i=0 To CountGadgetItems(#Editor_0) - 1
                If texte$=GetGadgetItemText(#Editor_0,i)
                  SelectEditorLine(#Editor_0, i)
                  Break
                EndIf
              Next i
          EndSelect
      EndSelect
      
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_0()
      
  EndSelect
ForEver
Mesa.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Message par Micoute »

Merci beaucoup à vous deux, maintenant j'ai compris le principe du splitter et il n'est pas dit que je ne réutilise pas les codes.
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 : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Message par Marc56 »

Je crois que ce que souhaite Micoute, c'est plus simplement un gestionnaire de notes ? (pas de signets dans la note)
Un truc comme TreePad ?

Splitter.pbf

Code : Tout sélectionner

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #Tree_0
  #Editor_0
  #Splitter_0
  #Btn_Quit
EndEnumeration

Declare ResizeGadgetsWindow_0()


Procedure OpenWindow_0(x = 0, y = 0, width = 600, height = 400)
  OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  TreeGadget(#Tree_0, 10, 15, 177, 340)
  EditorGadget(#Editor_0, 196, 15, 394, 340)
  SplitterGadget(#Splitter_0, 10, 15, 580, 340, #Tree_0, #Editor_0, #PB_Splitter_Vertical)
  SetGadgetState(#Splitter_0, 177)
  ButtonGadget(#Btn_Quit, 490, 365, 100, 25, "Quitter")
EndProcedure

Procedure ResizeGadgetsWindow_0()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_0)
  FormWindowHeight = WindowHeight(#Window_0)
  ResizeGadget(#Tree_0, 10, 15, 177, FormWindowHeight - 60)
  ResizeGadget(#Editor_0, FormWindowWidth - 404, 15, 394, FormWindowHeight - 60)
  ResizeGadget(#Splitter_0, 10, 15, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Btn_Quit, FormWindowWidth - 110, FormWindowHeight - 35, 100, 25)
EndProcedure
Splitter.pb

Code : Tout sélectionner

EnableExplicit

XIncludeFile "Splitter.pbf"

OpenWindow_0()

Define a.c
For a = 0 To 10
    AddGadgetItem(#Tree_0, -1, "Elément normal "+Str(a), 0, 0)  
    AddGadgetItem(#Tree_0, -1, "Noeud "+Str(a), 0, 0)          
    AddGadgetItem(#Tree_0, -1, "Sous-élément 1", 0, 1)         
    AddGadgetItem(#Tree_0, -1, "Sous-élément 2", 0, 1)
    AddGadgetItem(#Tree_0, -1, "Sous-élément 3", 0, 1)
    AddGadgetItem(#Tree_0, -1, "Sous-élément 4", 0, 1)
    AddGadgetItem(#Tree_0, -1, "Fichier "+ Str(a), 0, 0) 
Next

Repeat
    Select WaitWindowEvent()
            
        Case #PB_Event_CloseWindow
            Break
            
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Btn_Quit
                    Break  

                Case #Tree_0
                    If EventType() = #PB_EventType_LeftClick 
                        SetGadgetText(#Editor_0, "Note N° " + 
                                                 GetGadgetState(#Tree_0) +
                                                 " - Titre : " + 
                                                 GetGadgetItemText(#Tree_0, GetGadgetState(#Tree_0)))
                    EndIf
            EndSelect
            
        Case #PB_Event_SizeWindow
            ResizeGadgetsWindow_0()
            
    EndSelect
ForEver
Il ne reste plus qu'à mettre le contenu des EditorGadget dans une base de donnée, ou un fichier json ou des fichiers texte.

Par sécurité, on met un flag à chaque fois que l'utilisateur change le contenu de l'éditeur et on sauve la note au moment ou il change dans le TreeGadget.
(ou alors tout sauvegarder à la fin)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Message par Micoute »

Merci Marc56, oui c'est tout à fait ça et mes données seront cryptées dans un fichier hautement résistant à la rupture, pour qu'on puisse lire les données même si le fichier est corrompu jusqu'à 90%.
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 !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Message par Micoute »

Maintenant que j'ai construit mon système de construction de dossier et de notes, je souhaiterais cliquer sur le titre de la note pour entrer ses données dans l'éditeur, je n'ai pas fait de recherche, car je ne sais pas ce que je dois rechercher, alors comme d'habitude, je viens solliciter votre aide bienveillante et je vous en remercie à l'avance.

Code : Tout sélectionner

Procedure Nouveau_Dossier()
  Texte$ = InputRequester("Choisissez un nom pour le nouveau dossier", "", "")
  AddGadgetItem(#Arbre, -1, Texte$, 0, 0)
EndProcedure

Procedure Nouvelle_Note()
  Texte$ = InputRequester("Choisissez un nom pour la nouvelle note", "", "")
  AddGadgetItem(#Arbre, -1, Texte$, 0, 1)
EndProcedure
En gros, je ne sais pas quelle procédure je dois ajouter, ni comment créer plusieurs dossiers différents avec leurs notes propres.
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 : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Je voudrais créer un logiciel pour prendre des notes

Message par Marc56 »

Dans l'exemple que je t'ai donné, quand tu cliques avec le bouton gauche sur un élément du Tree, tu peux ensuite écrire dans l'éditeur.
Il ne te reste qu'à sauvegarder le contenu du gadget editeur, soit dans un fichier pour chacun, soit dans une base de données.

Pour donner un titre à la note, le mieux est à mon avis d'utiliser le bouton droit pour proposer des options.
(du plus simple: inputrequester pour renommer au plus élaboré: menu contextuel)

Code : Tout sélectionner

Case #Tree_0
     If EventType() = #PB_EventType_LeftClick
          SetGadgetText(#Editor_0, "Note N° " +
                                   GetGadgetState(#Tree_0) +
                                   " - Titre : " +
                                   GetGadgetItemText(#Tree_0, GetGadgetState(#Tree_0)))
          
     ElseIf EventType() = #PB_EventType_RightClick
          ; InputRequester pour renommer
          ; ou menu contextuel pour permettre d'ajouter / supprimer / renommer un élément
     EndIf
EndSelect
:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Je voudrais créer un logiciel pour prendre des notes

Message par Micoute »

Merci Marc56, je vais mettre en pratique tes bons enseignements !
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