Page 1 sur 1

Je voudrais créer un logiciel pour prendre des notes

Publié : mer. 28/sept./2016 19:53
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.

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Publié : jeu. 29/sept./2016 8:02
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)

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Publié : jeu. 29/sept./2016 8:34
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.

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Publié : jeu. 29/sept./2016 9:28
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.

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Publié : jeu. 29/sept./2016 9:30
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)

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Publié : jeu. 29/sept./2016 10:41
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%.

Re: Je voudrais marier un TreeGadget avec un EditorGadget

Publié : sam. 01/oct./2016 10:21
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.

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

Publié : sam. 01/oct./2016 14:45
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:

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

Publié : sam. 01/oct./2016 19:15
par Micoute
Merci Marc56, je vais mettre en pratique tes bons enseignements !