
en gros on ajouter des fichiers et dossier dans un TreeGadget(et une linkedlist) et à l'export on traite cette liste pour créer le pack
mais je galère trop dès qu'il y a une node.
si quelqu'un pouvait m'aider ... ça serait sympa
Code : Tout sélectionner
; CYBISOFT
;- Window Constants
;
Enumeration
#Main
#Log
EndEnumeration
;- Gadget Constants
;
Enumeration
#Frame3D_0
#Tree_0
#Button_1
#Button_2
#Frame3D_1
#Text_0
#String_0
#Button_3
#Text_1
#TrackBar_0
#Text_2
#Text_3
#Button_4
#Button_5
#Editor_0
EndEnumeration
Global icon_niveau, icon_dossier, icon_image, icon_mesh
Global ProjectName.s
Icon_niveau = CatchImage(1, ?Icon_niveau)
Icon_dossier= CatchImage(2, ?Icon_dossier)
Icon_image= CatchImage(3, ?Icon_image)
Icon_mesh= CatchImage(4, ?Icon_mesh)
DataSection
Icon_niveau:
IncludeBinary "niveau.ico"
icon_dossier:
IncludeBinary "Dossier.ico"
icon_image:
IncludeBinary "image.ico"
icon_mesh:
IncludeBinary "mesh.ico"
EndDataSection
Declare Export(file$)
Declare ProcessNode(id)
Structure Fichier
realfp.s
EndStructure
NewList Liste_Fichier.Fichier()
Procedure Ajout_Dossier()
id=GetGadgetState(#Tree_0)
If id<>0
text$=GetGadgetText(#Tree_0)
chr=Asc(Left(text$,1))
If id=1 : chr=32 : EndIf
If chr=32
SetGadgetState(#Tree_0,id)
OpenTreeGadgetNode(#Tree_0,id)
path$=InputRequester("Nom du répertoire","Entrez le nom du répertoire a ajouter (rien=annuler) :","")
If path$<>""
AddGadgetItem(#Tree_0,-1,Chr(32)+path$, UseImage(2))
EndIf
CloseTreeGadgetNode(#Tree_0,id)
ElseIf chr=160
MessageRequester("Erreur","Impossible d'ajouter un dossier a un fichier !",#MB_ICONEXCLAMATION)
Else
MessageRequester("Erreur","Le programme a rencontré une erreur inattendue."+Chr(10)+"Un caractère inattendu a été rencontré. Vous n'avez peut-être pas sélectionné d'item.",#MB_ICONERROR)
EndIf
EndIf
EndProcedure
Procedure Ajout_Dossier_Full()
id=GetGadgetState(#Tree_0)
If id<>0
text$=GetGadgetText(#Tree_0)
chr=Asc(Left(text$,1))
If id=1 : chr=32 : EndIf
If chr=32
SetGadgetState(#Tree_0,id)
OpenTreeGadgetNode(#Tree_0,id)
path_f$=PathRequester("Ajouter tous les fichiers d'un dossier","")
path$=InputRequester("Nom du répertoire","Entrez le nom du répertoire a ajouter (rien=annuler) :","")
If path$<>""
ExamineDirectory(0,path_f$,"")
AddGadgetItem(#Tree_0,-1,Chr(32)+path$, UseImage(2))
OpenTreeGadgetNode(#Tree_0)
Repeat
p=NextDirectoryEntry()
If p=1
If AddElement(Liste_Fichier())
Liste_Fichier()\realfp=DirectoryEntryName()
AddGadgetItem(#Tree_0,-1,Chr(160)+GetFilePart(DirectoryEntryName()), UseImage(3))
Else
MessageRequester("Erreur","Impossible d'allouer la mémoire pour ajouter un nouveau fichier !",#MB_ICONERROR)
EndIf
EndIf
Until p=0
CloseTreeGadgetNode(#Tree_0)
EndIf
CloseTreeGadgetNode(#Tree_0,id)
ElseIf chr=160
MessageRequester("Erreur","Impossible d'ajouter un dossier a un fichier !",#MB_ICONEXCLAMATION)
Else
MessageRequester("Erreur","Le programme a rencontré une erreur inattendue."+Chr(10)+"Un caractère inattendu a été rencontré. Vous n'avez peut-être pas sélectionné d'item.",#MB_ICONERROR)
EndIf
EndIf
EndProcedure
Procedure Ajout_Fichier()
id=GetGadgetState(#Tree_0)
If id<>0
text$=GetGadgetText(#Tree_0)
chr=Asc(Left(text$,1))
If id=1 : chr=32 : EndIf
If chr=32
SetGadgetState(#Tree_0,id)
OpenTreeGadgetNode(#Tree_0,id)
file$=OpenFileRequester("Ajouter un fichier","","Tous les fichiers (*.*)|*.*",0)
If FileSize(file$)>-1
If AddElement(Liste_Fichier())
Liste_Fichier()\realfp=file$
AddGadgetItem(#Tree_0,-1,Chr(160)+GetFilePart(file$), UseImage(3))
Else
MessageRequester("Erreur","Impossible d'allouer la mémoire pour ajouter un nouveau fichier !",#MB_ICONERROR)
EndIf
EndIf
CloseTreeGadgetNode(#Tree_0,id)
ElseIf chr=160
MessageRequester("Erreur","Impossible d'ajouter un fichier a un fichier !",#MB_ICONEXCLAMATION)
Else
MessageRequester("Erreur","Le programme a rencontré une erreur inattendue."+Chr(10)+"Un caractère inattendu a été rencontré. Vous n'avez peut-être pas sélectionné d'item.",#MB_ICONERROR)
EndIf
EndIf
EndProcedure
Procedure Open_Main()
If OpenWindow(#MAIN, 477, 107, 368, 568, #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Exportation du niveau en OLF")
If CreateGadgetList(WindowID())
Frame3DGadget(#Frame3D_0, 10, 5, 345, 370, "Contenu du fichier OLF")
TreeGadget(#Tree_0, 15, 20, 335, 325,#PB_Tree_AlwaysShowSelection)
;add
AddGadgetItem(#Tree_0,-1,"Niveau ("+StrF(FileSize("level.dat")/1000,2)+" Ko)",UseImage(1))
AddElement(Liste_Fichier())
Liste_Fichier()\realfp="level.dat"
AddGadgetItem( #Tree_0,-1,"Package",UseImage(2))
;lightmap adding
OpenTreeGadgetNode(#Tree_0,1)
If ReadFile(0,"table.tmp")
ProjectName.s=ReadString()
Repeat
If AddElement(Liste_Fichier())<>0
f$=ReadString()
Liste_Fichier()\realfp=f$
AddGadgetItem(#Tree_0,-1,Chr(215)+" "+GetFilePart(f$),UseImage(3))
Else
MessageRequester("Erreur","Impossible d'allouer la mémoire pour ajouter un nouveau fichier !",#MB_ICONERROR)
EndIf
Until Eof(0)<>0
EndIf
CloseTreeGadgetNode(#Tree_0,1)
;
SetGadgetState(#Tree_0,1)
ButtonGadget(#Button_1, 15, 350, 110, 20, "Ajouter")
ButtonGadget(#Button_2, 245, 350, 105, 20, "Supprimer")
Frame3DGadget(#Frame3D_1, 10, 385, 345, 135, "Informations d'exportation")
TextGadget(#Text_0, 20, 405, 105, 15, "Fichier a sauvegarder")
StringGadget(#String_0, 20, 420, 305, 20, "")
ButtonGadget(#Button_3, 330, 420, 20, 20, "...")
TextGadget(#Text_1, 20, 455, 120, 15, "Niveau de compression")
TrackBarGadget(#TrackBar_0, 60, 475, 245, 35, 0, 9, #PB_TrackBar_Ticks)
SetGadgetState(#TrackBar_0,6)
TextGadget(#Text_2, 305, 485, 45, 20, "Efficace")
TextGadget(#Text_3, 20, 485, 35, 15, "Rapide")
ButtonGadget(#Button_4, 200, 530, 110, 30, "Annuler")
ButtonGadget(#Button_5, 60, 530, 110, 30, "Compiler")
If CreatePopupMenu(0)
OpenSubMenu("Dossier")
MenuItem(1, "Ajouter un dossier")
MenuItem(2, "Ajouter tous les fichiers d'un dossier")
CloseSubMenu()
MenuItem(3, "Fichier")
EndIf
Repeat
e=WaitWindowEvent()
If e=#PB_Event_Gadget
Select EventGadgetID()
Case #Button_4 : End ;: DeleteFile("level.dat") : End
Case #Button_3
fp$=SaveFileRequester("Enregistrer le niveau OLF sous...","","Omicron Level File (.olf)|*.olf",0)
If fp$<>""
If LCase(Right(GetFilePart(fp$),4))<>".olf" : fp$=fp$+".olf" : EndIf
SetGadgetText(#String_0,fp$)
EndIf
Case #Tree_0 : If GetGadgetState(#Tree_0)=0 : SetGadgetState(#Tree_0,1) : EndIf
Case #Button_2
id=GetGadgetState(#Tree_0)
If Asc(Left(GetGadgetText(#Tree_0),1))=215 : id=1 : EndIf
If id>1 : RemoveGadgetItem(#Tree_0,id) : EndIf
Case #Button_1
DisplayPopupMenu(0, WindowID())
If WaitWindowEvent()=#PB_Event_Menu
Select EventMenuID()
Case 1 : Ajout_Dossier()
Case 2 : Ajout_Dossier_Full()
Case 3 : Ajout_Fichier()
EndSelect
EndIf
Case #Button_5
f$=GetGadgetText(#String_0)
If IsFilename(GetFilePart(f$))
If LCase(Right(f$,4))<>".olf" : f$=f$+".olf" : EndIf
HideWindow(#Main,1)
Export(f$)
Else
MessageRequester("Erreur","Le nom de fichier a sauvegarder n'est pas valide.",#MB_ICONEXCLAMATION)
EndIf
EndSelect
EndIf
Until e=#PB_Event_CloseWindow
EndIf
EndIf
EndProcedure
Global gt$,stop,compression
Procedure AddExportLog(text$)
gt$=GetGadgetText(#Editor_0)
If Left(text$,6)="ERREUR" : DisableGadget(#Editor_0,0) : MessageRequester("Erreur",text$,#MB_ICONERROR) : EndIf
SetGadgetText(#Editor_0,gt$+"["+FormatDate("%hh:%ii:%ss", Date())+"] "+text$)
EndProcedure
Procedure AddOLFDirectory(directory_name$)
AddExportLog("Ajout du répertoire "+directory_name$+"..."+Chr(10))
directory_name$="+"+directory_name$
If AddPackMemory(directory_name$,Len(directory_name$)+1,compression)
WindowEvent()
;succes
Else
AddExportLog("ERREUR : Impossible d'ajouter le répertoire (header) "+directory_name$+Chr(10))
EndIf
EndProcedure
Procedure AddOLFFile(file_name$)
ForEach Liste_Fichier()
If GetFilePart(Liste_Fichier()\realfp)=file_name$
Debug "Found file! Adding..."
AddExportLog("Déclaration du fichier "+GetFilePart(file_name$)+"..."+Chr(10))
If AddPackMemory(GetFilePart(file_name$),Len(GetFilePart(file_name$))+1,compression)
WindowEvent()
AddExportLog("Compression et ajout du fichier "+GetFilePart(file_name$)+"..."+Chr(10))
WindowEvent()
If AddPackFile(Liste_Fichier()\realfp,compression)
Else
AddExportLog("ERREUR : Impossible d'ajouter le fichier (compression) "+GetFilePart(file_name$)+Chr(10))
EndIf
Else
AddExportLog("ERREUR : Impossible d'ajouter le fichier (header) "+GetFilePart(file_name$)+Chr(10))
EndIf
WindowEvent()
Break
EndIf
Next
EndProcedure
Global NodeLevel,cur
Procedure Export(file$)
If OpenWindow(#Log, 379, 156, 515, 365, #PB_Window_TitleBar , "Compilation en cours...")
If CreateGadgetList(WindowID())
EditorGadget(#Editor_0, 5, 5, 505, 355)
DisableGadget(#Editor_0,1)
;export
d=ElapsedMilliseconds()
SetGadgetText(#editor_0,"OMICRON Level Editor v0.7"+Chr(10)+"OLF Compiler v0.7.1"+Chr(10)+Chr(10))
; AddExportLog("OMICRON Level Editor v0.7"+Chr(10))
; AddExportLog("OLF Compiler v0.7.1"+Chr(10)+Chr(10))
AddExportLog("Début de la procédure de compilation..."+Chr(10))
compression=GetGadgetState(#TrackBar_0)
AddExportLog("Niveau de compression défini a "+Str(compression)+"/9"+Chr(10))
AddExportLog("Initialisation du package..."+Chr(10))
pack_output=CreatePack(file$)
If pack_output
AddOLFFile("level.dat")
Dim NodeCount.l(CountGadgetItems(#Tree_0)-1)
id=2
finalid=CountGadgetItems(#Tree_0)-1
Debug Str(count)
For cur=id To finalid
name$=GetGadgetItemText(#Tree_0,cur,0)
l=Asc(Left(name$,1))
Select l
Case 160 ;fichier
name$=Right(name$,Len(name$)-1)
AddOLFFile(name$)
Case 32 ;dossier
name$=Right(name$,Len(name$)-1)
AddOLFDirectory(name$)
ProcessNode(cur)
Case 215 ;fichier immobile
name$=Right(name$,Len(name$)-2)
AddOLFFile(name$)
EndSelect
Next cur
AddExportLog("Finalisation..."+Chr(10)+Chr(10))
ClosePack()
d=ElapsedMilliseconds()-d
AddExportLog("Opération réalisée avec succès en "+StrF(d/1000)+" s"+Chr(10))
MessageRequester("Succes","Opération réalisée avec succès en "+StrF(d/1000)+" s",#MB_ICONINFORMATION)
DisableGadget(#Editor_0,0)
End
Else
AddExportLog("ERREUR : Impossible de créer le fichier pack "+file$+Chr(10))
EndIf
EndIf
EndIf
EndProcedure
Procedure ProcessNode(curid)
;on récupère le nom et l'id
nodecount(curid)=CountTreeGadgetNodeItems(#Tree_0,curid)
Debug Str(nodecount(curid))
;on détermine l'id réél
endid=nodecount(curid)+curid
;on traite
For i=curid To endid
name$=GetGadgetItemText(#Tree_0,i,0)
l=Asc(Left(name$,1))
Select l
Case 160 ;fichier
name$=Right(name$,Len(name$)-1)
AddOLFFile(name$)
Case 32 ;dossier
name$=Right(name$,Len(name$)-1)
AddOLFDirectory(name$)
ProcessNode(i)
Case 215 ;fichier immobile
name$=Right(name$,Len(name$)-2)
AddOLFFile(name$)
EndSelect
cur=i
Debug Str(i)
Next
EndProcedure
Open_Main()