Création d'un pack avec une arborescence

Programmation d'applications complexes
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Création d'un pack avec une arborescence

Message par mangatome »

Bonjour a tous :) je me lance dans un packer avec une arborescence "tree".
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()
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message par mangatome »

personne?
arg... :?
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ben, c'est la galère, les nodes

moi, le seul moyen que j'ai trouvé, c'est de gérer un tableau avec les infos, les niveaux (dans tel node ou pas)

et le treegadget, c'est juste l'affichage

à chaque changement, je le vide et je le rerempli en fonction du tableau
plutot barbare mais ça élimine les ennuis
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre