J'ai pas mal modifié mon level editor 2D (pour les jeux Arkeos et 3Arks) et j'en ai profité pour ajouté dans l'éditeur 3D (celui-ci) le même genre de fonctions :
- treegadget (pour le rangement et la sélection des objets, ainsi qu'un début de gestion de drag&drop)
- une sorte de property box qui s'affiche par type d'élément sélectionné.
- ajout d'une toolbar (avec la lib toolbar plus) pour avoir des options plus facilement accessibles.
Pour ceux que ça intéressent, voici le code simplifié du treegadget/propertybox :
Code : Tout sélectionner
;{ Treegadget : for leveleditor 2D ou 3D (or other)
; - with sort of Property box
; - creation of objects /assets
; - edition of properties
; date : 15/05/2012
; pb : 4.60 +
; dev : blendman
; For the games 3arks / Arkeos
;}
;{ constantes
#win = 0
#PanelSceneWidth = 180
#PanelPropertyWidth = 190
#StatusBar = 0
#fileSave = 0
#fileOpen = 1
Enumeration ; menu
#MenuMain
#Menupopup1
#Menupopup2
EndEnumeration
Enumeration ; images
; icones for treegadgets
#Assets
#pnj
#LightDyn
#Lightstatic
#Effects
#Action
#Fontain
#Drop
#FX
#Obj_Block
#Obj_Move
#Obj_Destroy
#Camera
; other
#file =50
#lightcolordif
#lightcolorspec
EndEnumeration
Enumeration ; gadget
; layout - outliner / scene
#PanelTreeGadget
#Treegadget_Scene
#Drop_Private
; property box - general
#PanelProperty
#Property_Frame1
#Property_Frame2
#Property_Frame3
#Property_Frame4
#Property_Frame5
#Property_Frame6
#Property_Frame7
; the objets properties
#Property_Name
#Property_PosX
#Property_PosY
#Property_PosZ
#Property_RotX
#Property_RotY
#Property_RotZ
#Property_ScaleX
#Property_ScaleY
#Property_ScaleZ
#Prop_CastShado
; object editor property
#property_id
#Property_cb_freeze
#Property_cb_hide
#Property_comb_lookTo
#Property_sg_LookTo
#Property_btn_LookTo
; light property
#Prop_ColDif_img
#Prop_ColDif_btn
#Prop_ColSpec_img
#Prop_ColSpec_btn
#Prop_LightType_ccb
EndEnumeration
;}
;{ structure
Structure StVector3
x.w : y.w : z.w
EndStructure
Structure StAsset ; les objets 3D de base (décors, arbres..)
;{ general
names$ : type.a
;}
;{ 2D
sprite.w
;}
;{ 3D mesh, material
meshname$ : meshId.w
material$ : matId.w
;}
;{ transformation
dimension.StVector3
pos.StVector3
rot.StVector3
scale.StVector3
;}
;{ editor
block.a : hide.a : lookTo.a
id.w
;}
;{ motion
;}
;{ light
colDif.i : colSpec.i
;}
EndStructure
Global NewList Asset.stAsset()
Structure StLevel
; 3D
NbMesh.w
NbMaterial.w
NbLight.w
; 2D
NbSprite.w
; other
NbEntity.w
EndStructure
Global Level.Stlevel
Structure StSceneTree
name$
EndStructure
Global Dim SceneTree.StSceneTree(12)
;}
;{ procedures new panel
Procedure AddPanelItem()
OpenGadgetList(#PanelProperty)
AddGadgetItem(#PanelProperty,0,"Properties")
AddGadgetItem(#PanelProperty,1,"Options")
EndProcedure
; macros
Macro SetGadget(gadget,h,chp,val,valmax)
For i=0 To 2
SpinGadget(gadget+i,10+i*(3+(w-16)/3),h,(w-16)/3,20,val,valmax,#PB_Spin_Numeric)
Next i
SetGadgetText(gadget,Str(asset()\chp\x))
SetGadgetText(gadget+1,Str(asset()\chp\y))
SetGadgetText(gadget+2,Str(asset()\chp\z))
EndMacro
; drag & drop (not used)
Procedure TreeDrag()
item = GetGadgetState(#Treegadget_Scene)
If GetGadgetItemAttribute(#Treegadget_Scene,item,#PB_Tree_SubLevel)>0
DragPrivate(#Drop_Private, #PB_Drag_Move)
EndIf
EndProcedure
Procedure TreeDrop()
item = GetGadgetState(#Treegadget_Scene)
If GetGadgetItemAttribute(#Treegadget_Scene,item,#PB_Tree_SubLevel)>0
sText.s = GetGadgetItemText(#Treegadget_Scene, sItem)
Text.s = GetGadgetItemText(#Treegadget_Scene, Item)
SetGadgetItemText(#Treegadget_Scene, sItem, Text)
SetGadgetItemText(#Treegadget_Scene, Item, sText)
EndIf
EndProcedure
; property
Procedure PropertyBox(type=0)
item = GetGadgetState(#Treegadget_Scene)
If GetGadgetItemAttribute(#Treegadget_Scene,item,#PB_Tree_SubLevel)>0
ClearGadgetItems(#PanelProperty)
w = #PanelPropertyWidth-20
AddPanelItem()
OpenGadgetList(#PanelProperty,0)
With asset()
Frame3DGadget(#Property_Frame1,5,5,w,40,"General")
StringGadget(#Property_Name,10,20,w-10,20,\names$)
Frame3DGadget(#Property_Frame2,5,60,w,40,"Position")
SetGadget(#Property_PosX,75,pos,-10000,10000)
dee = 100
; on ajoute les generalité
Select \type
Case 0,1,6,7,9,10,11,12
Frame3DGadget(#Property_Frame3,5,100,w,40,"Rotation")
SetGadget(#Property_RotX,115,rot,-180,180)
Frame3DGadget(#Property_Frame4,5,140,w,40,"Scale")
SetGadget(#Property_ScaleX,155,scale,1,1000)
dee = 190
Frame3DGadget(#Property_Frame6,5,dee,w,100,"Editor")
CheckBoxGadget(#property_cb_freeze,10,dee+15,50,15,"Freeze")
CheckBoxGadget(#property_cb_hide,70,dee+15,40,15,"Hide")
TextGadget(#property_id,120,dee+15,40,15,"ID : "+Str(Asset()\id),#PB_Text_Center)
SetGadgetColor(#property_id,2,$E6E6E6)
DisableGadget(#property_id,1)
ComboBoxGadget(#property_comb_lookTo,10,dee+35,60,20)
GadgetToolTip(#property_comb_lookTo,"Object Look at...")
AddGadgetItem(#property_comb_lookTo,-1,"Object")
AddGadgetItem(#property_comb_lookTo,-1,"Player")
AddGadgetItem(#property_comb_lookTo,-1,"Camera")
StringGadget(#Property_sg_LookTo,75,dee+35,70,20,"")
GadgetToolTip(#Property_sg_LookTo,"The Cible of the 'look at'..")
ButtonGadget(#Property_btn_LookTo,150,dee+35,20,20,"...")
dee+110
Frame3DGadget(#Property_Frame5,5,dee,w,50,"Properties")
CheckBoxGadget(#Prop_CastShado,10,dee+15,w-10,20,"Cast Shadow")
dee +120
EndSelect
Select type
Case 0 ; assets
Frame3DGadget(#Property_Frame7,5,dee,w,50,"Motion")
Case 1 ; pnj
Case 2 ; light dynamic
dee+10
Frame3DGadget(#Property_Frame3,5,dee,w,100,"Editor")
CheckBoxGadget(#property_cb_freeze,10,dee+15,50,15,"Freeze")
CheckBoxGadget(#property_cb_hide,70,dee+15,50,15,"Hide")
TextGadget(#property_id,120,dee+15,40,15,"ID : "+Str(Asset()\id),#PB_Text_Center)
SetGadgetColor(#property_id,2,$E6E6E6)
DisableGadget(#property_id,1)
ComboBoxGadget(#property_comb_lookTo,10,dee+35,60,20)
GadgetToolTip(#property_comb_lookTo,"Object Look To...")
AddGadgetItem(#property_comb_lookTo,-1,"Object")
AddGadgetItem(#property_comb_lookTo,-1,"Player")
AddGadgetItem(#property_comb_lookTo,-1,"Camera")
StringGadget(#Property_sg_LookTo,75,dee+35,70,20,"")
ButtonGadget(#Property_btn_LookTo,150,dee+35,20,20,"...")
dee +110
Frame3DGadget(#Property_Frame4,5,dee,w,80,"Properties")
StartDrawing(ImageOutput(#lightcolordif))
Box(0,0,15,15,asset()\colDif)
StopDrawing()
ImageGadget(#Prop_ColDif_img,15,dee+17,15,15,ImageID(#lightcolordif))
GadgetToolTip(#Prop_ColDif_img,"Diffuse Color of the light")
ButtonGadget(#Prop_ColDif_btn,35,dee+15,20,20,"...")
StartDrawing(ImageOutput(#lightcolordif))
Box(0,0,15,15,asset()\colSpec)
StopDrawing()
ImageGadget(#Prop_ColSpec_img,65,dee+17,15,15,ImageID(#lightcolorspec))
GadgetToolTip(#Prop_ColSpec_img,"Specular Color of the ight")
ButtonGadget(#Prop_ColSpec_btn,85,dee+15,20,20,"...")
CheckBoxGadget(#Prop_CastShado,110,dee+15,55,20,"Shadow")
ComboBoxGadget(#Prop_LightType_ccb,15,dee+40,w-60,20)
AddGadgetItem(#Prop_LightType_ccb,0,"Point Light")
AddGadgetItem(#Prop_LightType_ccb,1,"Directionnal Light")
AddGadgetItem(#Prop_LightType_ccb,2,"Spot Light")
SetGadgetState(#Prop_LightType_ccb,0)
Case 3 ; lights static
Frame3DGadget(#Property_Frame4,5,120,130,50,"Properties")
Case 4 ;effects
Case 5;actions
Case 6;fontain
Case 7 ;Drop
Case 8 ;Fx
Case 9 ;Obj block
Case 10 ;Obj move
Case 11 ;Obj destroy
Case 12 ;camera
FreeGadget(#Property_Frame5)
FreeGadget(#Prop_CastShado)
EndSelect
EndWith
EndIf
EndProcedure
Procedure UpdateTreeGadget()
ClearGadgetItems(#Treegadget_Scene)
pos = GetGadgetState(#Treegadget_Scene)
For i = 0 To ArraySize(SceneTree())
If IsImage(i)
AddGadgetItem (#Treegadget_Scene, -1, SceneTree(i)\name$, ImageID(i),0)
Else
AddGadgetItem (#Treegadget_Scene, -1, SceneTree(i)\name$, ImageID(#Assets),0)
EndIf
ForEach Asset()
If asset()\type = i
AddGadgetItem(#Treegadget_Scene, pos, asset()\names$, ImageID(asset()\type), 1)
SetGadgetItemData(#Treegadget_Scene,CountGadgetItems(#Treegadget_Scene)-1,-1)
EndIf
Next
Next i
EndProcedure
Procedure CheckProperty(nom$)
ForEach Asset()
If Asset()\names$ = nom$
PropertyBox(Asset()\type)
Break
EndIf
Next
EndProcedure
Procedure AddAsset(name$="",x=0,y=0,z=0,type=0)
Level\NbEntity+1
AddElement(asset())
With Asset()
\names$ = name$
\pos\x = x
\pos\y = y
\pos\z = z
\id = Level\NbEntity
\type = type
If \type = 2 Or \type = 3 ; light
\colDif = Random(#White)
\colSpec = Random(#White)
EndIf
EndWith
EndProcedure
; open save, scene
Procedure OpenScene()
file$=OpenFileRequester("Open","","(*.ale)|*.ale",0)
If file$ <>""
; read you own format, here
If OpenFile(#fileOpen,file$)
ClearList(asset())
While Eof(#fileOpen)=0
a$=ReadString(#fileOpen)
obj$ = StringField(a$,1,"|")
compt= CountString (a$,"|")
If compt > 0
AddElement(Asset())
With Asset()
; the parameters which are for all objects
\names$ = StringField(a$,2,"|")
\pos\x = Val(StringField(a$,3,"|"))
\pos\y = Val(StringField(a$,4,"|"))
\pos\z = Val(StringField(a$,5,"|"))
Select obj$
Case "obj"
\type = 0
Case "npc"
\type = 1
Case "light_dyn"
\type = 2
Case "camera"
\type = 12
; add the other case here...
EndSelect
EndWith
EndIf
Wend
CloseFile(#fileOpen)
UpdateTreeGadget()
EndIf
EndIf
EndProcedure
Procedure SaveScene()
file$=OpenFileRequester("Open","","(*.ale)|*.ale",0)
If file$ <>""
file$ = RemoveString(file$,".ale")+".ale"
; save your own format here
If OpenFile(#fileSave,file$)
WriteStringN(#fileSave,"Created with the 3Arks/Arkeos Level Editor, by Blendman 2012")
ForEach Asset()
With asset()
Select \type
Case 0 ; assets, object normal
param$ = "obj|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
WriteStringN(#fileSave, param$)
Case 1 ; NPC (pnj)
param$ = "npc|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
WriteStringN(#fileSave, param$)
Case 2 ; light dyn
param$ = "light_dyn|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
WriteStringN(#fileSave, param$)
; case 3 , case 4, etc....
Case 12 ; camera
param$ = "camera|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
WriteStringN(#fileSave, param$)
EndSelect
EndWith
Next
CloseFile(#fileSave)
EndIf
EndIf
EndProcedure
; drawing screen
Procedure DrawScreen()
Start3D()
ForEach Asset()
DisplaySprite3D(asset()\sprite,Asset()\pos\x,Asset()\pos\y)
Next
Stop3D()
EndProcedure
;}
;{ open widnows
;{ init
ExamineDesktops()
winW = DesktopWidth(0)
winH = DesktopHeight(0)-32
InitSprite() : InitSprite3D()
;}
flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize|#PB_Window_MinimizeGadget
If OpenWindow(#win, 0, 0, winW, WinH, "Arkeos Level Editor", flag)
;{ images
UsePNGImageDecoder()
; icones
;{ catch
CatchImage(#Assets,?ImgAsset)
CatchImage(#PNJ,?ImgPnj)
CatchImage(#LightDyn,?ImgLightDyn)
CatchImage(#Lightstatic,?ImgLightStat)
CatchImage(#action,?ImgAction)
CatchImage(#Effects,?ImgEffects)
CatchImage(#Drop,?ImgDrop)
CatchImage(#Obj_Move,?ImgObj_Move)
CatchImage(#Obj_Block,?ImgObj_Block)
CatchImage(#Obj_Destroy,?ImgObj_Destroy)
CatchImage(#Camera,?ImgCamera)
CatchImage(#Fontain,?ImgFontain)
CatchImage(#FX,?ImgFX)
;}
;{ images
;LoadImage(#Assets,"assets.ico")
;LoadImage(#PNJ,"pnj.ico")
;LoadImage(#LightDyn,"light.png")
;LoadImage(#Lightstatic,"lightstat.ico")
;LoadImage(#action,"actions.ico")
;LoadImage(#Effects,"effects.ico")
;LoadImage(#Drop,"drop.ico")
;LoadImage(#Obj_Move,"obj_move.ico")
;LoadImage(#Obj_Block,"obj_block.ico")
;LoadImage(#Obj_Destroy,"obj_destroy.ico")
;LoadImage(#Camera,"camera.ico")
;LoadImage(#Fontain,"fontain.ico")
;LoadImage(#FX,"fx.ico")
;}
; image for property
CreateImage(#lightcolordif,15,15)
CreateImage(#lightcolorspec,15,15)
;}
;{ menu
CreateImageMenu(#MenuMain,WindowID(0),#PB_Menu_ModernLook)
MenuTitle("File") ;0->20
MenuItem(0,"New"+Chr(9)+"Ctrl+N")
MenuBar()
MenuItem(1,"Open"+Chr(9)+"Ctrl+O")
MenuItem(2,"Save"+Chr(9)+"Ctrl+S")
MenuBar()
MenuItem(3,"Exit"+Chr(9)+"Esc")
MenuTitle("Object")
MenuItem(100,"Assets",ImageID(#Assets))
MenuItem(101,"PNJ",ImageID(#PNJ))
MenuBar()
MenuItem(102,"Light Dyn",ImageID(#LightDyn))
MenuItem(103,"Light Stat",ImageID(#Lightstatic))
MenuBar()
MenuItem(104,"Effects",ImageID(#Effects))
MenuItem(108,"Fx",ImageID(#FX))
MenuBar()
MenuItem(105,"Add Actions",ImageID(#action))
MenuItem(106,"Add Fontain",ImageID(#Fontain))
MenuItem(107,"Add Drop",ImageID(#Drop))
MenuBar()
MenuItem(109,"Add Object Blocking",ImageID(#Obj_Block))
MenuItem(110,"Add Object To Move",ImageID(#Obj_Move))
MenuItem(111,"Add Object to destroy",ImageID(#Obj_Destroy))
MenuBar()
MenuItem(112,"Add Camera",ImageID(#Camera))
MenuTitle("Edit"); 21-> 40
MenuTitle("Help") ; 60->70
MenuItem(60,"Preferences")
MenuBar()
MenuItem(61,"Help")
MenuItem(62,"About")
;}
;{ status bar
CreateStatusBar(#StatusBar,WindowID(#win))
AddStatusBarField(200)
AddStatusBarField(300)
AddStatusBarField(300)
;}
;{ toolbar
;CreateToolBar(0,WindowID(#win))
;ToolBarStandardButton(0,#PB_ToolBarIcon_Open)
;}
;{ gadgets
If PanelGadget(#PanelTreeGadget, 5, 0, #PanelSceneWidth, winH-60-StatusBarHeight(#StatusBar))
AddGadgetItem(#PanelTreeGadget,0,"Scene")
TreeGadget(#Treegadget_Scene, 5, 5, #PanelSceneWidth-20, winH-60-StatusBarHeight(#StatusBar)-400); , #PB_Tree_CheckBoxes)
AddGadgetItem(#PanelTreeGadget,1,"Bank")
CloseGadgetList()
EnableGadgetDrop( #Treegadget_Scene, #PB_Drop_Private, #PB_Drag_Move, #Drop_Private )
EndIf
If OpenPreferences("preferences.ini")
n = ReadPreferenceInteger("nb",12)
ReDim SceneTree(n)
Restore SceneTree
For i = 0 To n
Read.s nom$
SceneTree(i)\name$ = ReadPreferenceString("element"+Str(i),nom$)
Next i
ClosePreferences()
Else
Restore SceneTree
For i = 0 To 12
Read.s SceneTree(i)\name$
Next i
EndIf
UpdateTreeGadget()
If PanelGadget(#PanelProperty,winW-#PanelPropertyWidth-5,10,#PanelPropertyWidth,winH-60-StatusBarHeight(#StatusBar))
AddPanelItem()
EndIf
;}
;{ shortcut
AddKeyboardShortcut(#win,#PB_Shortcut_N|#PB_Shortcut_Control,0)
AddKeyboardShortcut(#win,#PB_Shortcut_O|#PB_Shortcut_Control,1)
AddKeyboardShortcut(#win,#PB_Shortcut_S|#PB_Shortcut_Control,2)
AddKeyboardShortcut(#win,#PB_Shortcut_Escape,3)
;}
;{ init gadget
AddAsset("Tree01",54,68)
AddAsset("house01",Random(2000),Random(2000))
AddAsset("Plant01",Random(2000),Random(2000))
AddAsset("Tree02",Random(2000),Random(2000))
AddAsset("Plant02",Random(2000),Random(2000))
AddAsset("Plant03",Random(2000),Random(2000))
AddAsset("Plant04",Random(2000),Random(2000))
AddAsset("Roberto",64,89,0,1)
AddAsset("CameraMain",200,400,300,12)
AddAsset("Light01",50,300,250,2)
UpdateTreeGadget()
;}
;{ menu popup 1
CreatePopupImageMenu(#Menupopup1)
MenuItem(99,"Add Object")
MenuBar()
For i = 0 To ArraySize(SceneTree())
MenuItem(100+i,SceneTree(i)\name$,ImageID(i))
Next i
;}
;{ add screen
ScreenW = winW - #PanelSceneWidth - #PanelPropertyWidth -20
ScreenH = winH - 85
If OpenWindowedScreen(WindowID(#win),#PanelSceneWidth+10,10,ScreenW,ScreenH,0,0,80)
EndIf
;}
;}
;{ loop
Repeat
;{ event (gadget, menu..)
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_CloseWindow
If GetActiveWindow() = #win
quit =1
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case 1
OpenScene()
Case 2
SaveScene()
Case 3
quit = 1
Case 62 ; about
MessageRequester("About","Level Editor Made by Blendman")
Case 100 To 100+ArraySize(SceneTree())
nom$ = InputRequester("Name","Add an element","")
If nom$ <>""
AddAsset(nom$,Random(500),Random(500),Random(500),EventMenu()-100)
UpdateTreeGadget()
EndIf
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #Treegadget_Scene
Select EventType()
Case #PB_EventType_LeftClick
CheckProperty(GetGadgetText(#Treegadget_Scene))
Case #PB_EventType_RightClick
DisplayPopupMenu(1,WindowID(0))
Case #PB_EventType_DragStart ; drag
sItem = GetGadgetState(#Treegadget_Scene)
If GetGadgetItemAttribute(#Treegadget_Scene,sItem,#PB_Tree_SubLevel)>0
sText.s = GetGadgetItemText(#Treegadget_Scene, sItem)
ForEach asset()
If asset()\names$ = sText
sType = asset()\type
Break
EndIf
Next
DragPrivate(#Drop_Private, #PB_Drag_Move)
EndIf
EndSelect
; For i = 0 To ArraySize(SceneTree())-1
; If GetGadgetText(#Treegadget_Scene) = scenetree(i)\name$
; PropertyBox(i)
; Break
; EndIf
; Next i
EndSelect
Case #PB_Event_GadgetDrop ; event drop
Select EventDropType()
Case #PB_Drop_Private
tItem = GetGadgetState(#Treegadget_Scene)
If GetGadgetItemAttribute(#Treegadget_Scene,tItem,#PB_Tree_SubLevel)>0
tText.s = GetGadgetItemText(#Treegadget_Scene, tItem)
ForEach asset()
If asset()\names$ = tText
If asset()\type = sType
SetGadgetItemText(#Treegadget_Scene, sItem, tText)
SetGadgetItemText(#Treegadget_Scene, tItem, sText)
EndIf
Break
EndIf
Next
EndIf
EndSelect
EndSelect
Until event = 0 Or quit = 1
;}
;{ Screen
ClearScreen(RGB(125,125,125))
FlipBuffers()
;}
Until quit = 1
EndIf
;}
;{ data
DataSection
ImgAsset: IncludeBinary "assets.ico"
ImgPnj: IncludeBinary "pnj.ico"
ImgLightDyn: IncludeBinary "light.png"
ImgLightStat: IncludeBinary "lightstat.ico"
ImgAction: IncludeBinary "actions.ico"
ImgEffects: IncludeBinary "effects.ico"
ImgDrop: IncludeBinary "drop.ico"
ImgObj_Move: IncludeBinary "obj_move.ico"
ImgObj_Block: IncludeBinary "obj_block.ico"
ImgObj_Destroy: IncludeBinary "obj_destroy.ico"
ImgCamera: IncludeBinary "camera.ico"
ImgFontain: IncludeBinary "fontain.ico"
ImgFX: IncludeBinary "fx.ico"
SceneTree: ; you can change here to have your langage:
Data.s "Assets","NPC","Light Dyn","Light Static","Effects","Actions","Fontain","Drop","FX","Obj_Block","Obj_Move","Obj_Destroy","Camera"
EndDataSection
;}
Et sinon, voici un screenshot wip de l’éditeur 3D (je n'ai pas encore eu le temps de finir, vu que je termine en priorité l'éditeur 2D pour Arkeos ainsi qu'Arkeos et 3Arlks (jeu 2D)
J'essaierai de proposer une nouvelle version de l'éditeur lorsque j'aurai terminé tout le système (avec drag & drop des éléments du treegadget et ajout de dossier dans chaque sous partie, etc.. bref, ce ne sera pas pour tout de suite
).