L'exemple que j'ai donné à Micoute la semaine dernière pour illustrer le splitter m'a donné l'envie d'ajouter un gestionnaire de notes à mon ACME Desk.
Afin de mettre au point le "moteur" (from scratch, car j'aime comprendre), j'en ai réalisé un programme autonome.
Voici donc ACME TreeNote

La première beta version est disponible ici
C'est pour l'instant rudimentaire, cela ne peut qu'ajouter des notes, les renommer et remplir

Les données sont sauvées au format JSON
Je cherche maintenant à déplacer les notes dans l'arbre (pour l'instant uniquement à la verticale)
J'en profite aussi pour (essayer de) gérer tous les évènements à l'aide des BindEvent.

Exemple épuré (basé sur ce que j'avais proposé à Micoute au sujet du splitter)
Code : Tout sélectionner
EnableExplicit
; --- Form (réalisé par le Form Designer)
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, GadgetWidth(#Splitter_0) - 90, GadgetHeight(#Splitter_0) - -25, 100, 25)
EndProcedure
; --- Code principal
OpenWindow_0()
; --- Activation du D&D pour le treegadget
EnableGadgetDrop(#Tree_0, #PB_Drop_Private, #PB_Drag_Move, 1)
Define a.c
For a = 0 To 3
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
Procedure Quit()
End
EndProcedure
Procedure Note_Select()
SetGadgetText(#Editor_0, "Note N° " +
GetGadgetState(#Tree_0) +
" - Titre : " +
GetGadgetItemText(#Tree_0, GetGadgetState(#Tree_0)))
EndProcedure
Procedure Drag_Start()
Debug "Drag_Start"
DragPrivate(1, #PB_Drag_Move)
EndProcedure
Procedure Drag_Drop()
Debug "Drop"
; Devrait afficher "Drop" quand on relache la souris, mais ne fonctionne pas
EndProcedure
; --- Gestion des évènements
; --- Fenêtre
BindEvent(#PB_Event_CloseWindow, @Quit(), #Window_0)
BindEvent(#PB_Event_SizeWindow, @ResizeGadgetsWindow_0(), #Window_0)
; --- Gadgets
BindGadgetEvent(#Btn_Quit, @Quit())
; --- Déplacement des notes dans le TreeGadget par drag'n'drop
BindGadgetEvent(#Tree_0, @Drag_Start(), #PB_EventType_DragStart)
BindGadgetEvent(#Tree_0, @Drag_Drop(), #PB_Drop_Private) ; <--- ça marche pô :o(
; --- Sélection
BindGadgetEvent(#Tree_0, @Note_Select(), #PB_EventType_LeftClick)
Repeat : WaitWindowEvent() : ForEver

Tout fonctionne, sauf qu'il ne détecte pas le Drop (le debug devrait afficher drop)

Il y a quelque chose qui ne va pas dans ma ligne ?
Code : Tout sélectionner
BindGadgetEvent(#Tree_0, @Drag_Drop(), #PB_Drop_Private)
Il doit y avoir un truc bête

