[SOCPB 2006] Projet # 5 : GUI performante pour lib Screen

Sujets variés concernant le développement en PureBasic
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

cha0s a écrit :car l'utilisateur peut tomber sur un numero d'image deja utilisé par le gui.
Ca n'est plus vrai depuis looooongtemps
Maintenant #PB_Any alloue dynamiquement l'objet en question...

Par exemple pour une image
Index = CreateImage(#PB_Any, 320, 240)
Le numéro de l'image dynamique (Index) correspondra à l'adresse mémoire de la structure PB_Image de l'image créée
cha0s a écrit :Edit : sinon une petite question a dri est il possible de classer les objets ?(comme dans une list)
J'ai envie de répondre oui mais il me faudrait plus de détails...

Dri
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Merci dri sa m'eclaire beaucoup que ferai je sans toi :lol:
Dr. Dri a écrit : J'ai envie de répondre oui mais il me faudrait plus de détails...
En fait si je reprend ton exemple

Code : Tout sélectionner

  Object_EnumerateStart(TimerObjects) 
  
  While Object_EnumerateNext(TimerObjects, @Temp) 
    *Timer = Object_GetObject(TimerObjects, Temp) 
    
    If *Timer\Window = Window And *Timer\Event = Event 
      Object_EnumerateAbort(TimerObjects) 
      Timer = Temp 
    EndIf 
  Wend 
on voit que les objets sont enumeré dans un certain orde or il me faudrait pouvoir les classer comme une list selon un parametre croisant ou décroissant tu comprend ce que je veut dire?
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

oups double post -_-
Dernière modification par cha0s le lun. 26/juin/2006 16:30, modifié 2 fois.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Question Idiote ! Est ce que ce projet fonctionnera pour les versions MacOSX et Linux de Purebasic ?
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

je pense que ce sera compatible pour les version 4...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

cha0s a écrit :je pense que ce sera compatible pour les version 4...
Génial ! :D
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

voici donc le code actuel de la lib :

Code : Tout sélectionner

CompilerIf #PB_Compiler_Thread ;> 
  #ObjectManager = "Compilers/ObjectManagerThread.lib" 
CompilerElse ;= 
  #ObjectManager = "Compilers/ObjectManager.lib" 
CompilerEndIf;< 

Import #PB_Compiler_Home + #ObjectManager 
  Object_GetOrAllocate   (Objects, Object.l) As "_PB_Object_GetOrAllocateID@8" 
  Object_GetObject       (Objects, Object.l) As "_PB_Object_GetObject@8" 
  Object_IsObject        (Objects, Object.l) As "_PB_Object_IsObject@8" 
  Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) As "_PB_Object_EnumerateAll@12" 
  Object_EnumerateStart  (Objects) As "_PB_Object_EnumerateStart@4" 
  Object_EnumerateNext   (Objects, *object.Long) As "_PB_Object_EnumerateNext@8" 
  Object_EnumerateAbort  (Objects) As "_PB_Object_EnumerateAbort@4" 
  Object_Free            (Objects, Object.l) As "_PB_Object_FreeID@8" 
  Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) As "_PB_Object_Init@12" 
  Object_GetThreadMemory (MemoryID.l) As "_PB_Object_GetThreadMemory@4" 
  Object_InitThreadMemory(Size.l, InitFunction, EndFunction) As "_PB_Object_InitThreadMemory@12" 
EndImport 
Prototype ObjectFreeFunction(Object.l) 

Structure PB_SimpleList 
  *Next    .PB_SimpleList 
  *Previous.PB_SimpleList 
EndStructure 

Structure PB_Object 
  ; 
  StructureSize.l 
  IncrementStep.l 
  ObjectsNumber.l 
  *ListFirstElement.PB_SimpleList 
  ; 
  FreeObject.ObjectFreeFunction 
  ; 
  Current.l 
  *CurrentElement.PB_SimpleList 
  ; 
  CompilerIf #PB_Compiler_Thread ;> 
    IncrementShift.l 
    *FirstObjectsArea.PB_SimpleList 
    *LastObjectsArea .PB_SimpleList 
    ObjectMutex.CRITICAL_SECTION 
  CompilerElse ;= 
    *ObjectsArea 
  CompilerEndIf ;< 
  ; 
EndStructure 


Declare Screen_CloseWindow(Fenetre.l)

Procedure InitScreen_Window() 
;Initialise les fonctions screen window. A appeler en avant les commandes de screenwindow.

;declarations
;{
#Screen_Theme = 0
#Screen_Skin = 1

Structure Screen_FenetreClassementStructure
  position.b
  fenetre.l
EndStructure
Global NewList Screen_FenetreClassement.Screen_FenetreClassementStructure()

Structure Screen_FenetreStructure ;structure d'une fenetre
  Nom.s
  Numero.l
  TailleX.l
  TailleY.l
  PositionX.l
  PositionY.l
  Theme.l
  Hide.b
  Type.l
  Selected.l
  Position.l
  Couleur.l[10];a definir le nombre de couleur max
  Sprite.l
EndStructure
;Global Screen_Fenetre.Screen_FenetreStructure

Structure Screen_GadgetStructure ;structure d'un gadget
  Numero.l
  Fenetre.l
  TailleX.l
  TailleY.l
  PositionX.l
  PositionY.l
  Theme.l
  Hide.b
  type.b
  Texte.s
  Couleur.l[10];a definir le nombre de couleur max
EndStructure
;Global Screen_Gadget.Screen_GadgetStructure

Structure Screen_ThemeStructure ;structure d'un theme
  Nom.s
  Taille.l[10];a definir le nombre de dimension max
  Couleur.l[10];a definir le nombre de couleur max
  Police.s
  PoliceTaille.l
EndStructure
;Global Screen_Theme.Gui_ThemeStructure

Global ScreenFenetreObjects
 ScreenFenetreObjects = Object_Init(SizeOf(Screen_FenetreStructure), 1, @Screen_CloseWindow())
 
 
 Global Dim ScreenVar(4)
 Global ScreenDecalageselectX,ScreenDecalageselectY 
;}
 
EndProcedure

InitScreen_Window() 



Procedure Screen_CloseWindow(Fenetre.l)
  Protected *Screen_Fenetre.Screen_FenetreStructure
  
  If Object_IsObject(ScreenFenetreObjects, Fenetre) 
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Fenetre) 
  EndIf 
  
  If *Screen_Fenetre 
    Object_Free(ScreenFenetreObjects, Fenetre) 
  EndIf 
EndProcedure




Procedure Screen_OpenWindow(Fenetre.l, x, y, LargeurInterne, HauteurInterne, Titre$ , Theme, Type = 0)
  Protected Resultat = 0, *Screen_Fenetre.Screen_FenetreStructure, color1, CouleurBordureBarre, TailleBarreBordure, CouleurPolice, Police
  ;Screen_OpenWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Titre$ , #Theme[, Type]) 
  ;Ouvre une fenêtre avec le thème actuellement utilisé ou le thème par defaut. 
  ;Si #PB_Any est utilisé pour le paramètre 'Fenetre', le numéro de la fenêtre sera renvoyé dans 'Resultat'. 
  ;Si Type vaut #Screen_Skin , alors la fenêtre sera utilisera le skin numéro #Theme.
  If Fenetre And LargeurInterne > 0 And HauteurInterne > 0 And Theme
    *Screen_Fenetre = Object_GetOrAllocate(ScreenFenetreObjects, Fenetre)
    If *Screen_Fenetre 
      *Screen_Fenetre\Numero  = Fenetre 
      *Screen_Fenetre\TailleX = LargeurInterne 
      *Screen_Fenetre\TailleY = HauteurInterne
      *Screen_Fenetre\Nom = Titre$
      *Screen_Fenetre\PositionX = x
      *Screen_Fenetre\PositionY = y
      *Screen_Fenetre\Theme = Theme
      *Screen_Fenetre\Type = Type
      *Screen_Fenetre\Sprite = CreateSprite(#PB_Any, LargeurInterne, HauteurInterne , #PB_Sprite_Texture)
      If Theme = #PB_Any
        color1 = RGB(162, 162, 162)
        CouleurBordureBarre = RGB(110, 110, 110)
        TailleBarreBordure = 2
        CouleurPolice = RGB(0, 0, 0)
        Police = LoadFont(#PB_Any , "", 15 )
        HauteurTitre = 20
        HauteurTitreCouleur = RGB(135, 135, 135)
        TransparentSpriteColor(*Screen_Fenetre\Sprite, RGB(255, 0, 255))
      EndIf
      If *Screen_Fenetre\Sprite And StartDrawing(SpriteOutput(*Screen_Fenetre\Sprite))
        ;fond principal
        Box(0, 0, LargeurInterne, HauteurInterne ,color1)
        ;fond haut de fenetre
        Box(TailleBarreBordure, TailleBarreBordure,LargeurInterne-TailleBarreBordure*2,HauteurTitre,HauteurTitreCouleur)
        ;bordure
        ;haut
        Box(0, 0, LargeurInterne, TailleBarreBordure, CouleurBordureBarre)
        ;millieu
        Box(0, HauteurTitre+TailleBarreBordure, LargeurInterne, TailleBarreBordure, CouleurBordureBarre)
        ;droite
        Box(0, 0,TailleBarreBordure,HauteurInterne,CouleurBordureBarre)
        ;gauche
        Box(LargeurInterne-TailleBarreBordure, 0,TailleBarreBordure,HauteurInterne,CouleurBordureBarre)
        ;bas
        Box(0, HauteurInterne-TailleBarreBordure,LargeurInterne,TailleBarreBordure,CouleurBordureBarre)
        ;Titre
        If Titre$
          FrontColor(CouleurPolice)
          DrawingMode(1) 
          DrawingFont(FontID(Police))
          DrawText(TailleBarreBordure, TailleBarreBordure,Titre$)
        EndIf 
        StopDrawing()
      
        If Fenetre = #PB_Any 
          Resultat = *Screen_Fenetre 
        ElseIf *Screen_Fenetre
          Resultat = *Screen_Fenetre\Numero 
        EndIf
        AddElement(Screen_FenetreClassement())
        Screen_FenetreClassement()\position = 1
        Screen_FenetreClassement()\fenetre = Resultat
        If CountList(Screen_FenetreClassement()) > 1
          ForEach Screen_FenetreClassement()
            If Screen_FenetreClassement()\fenetre <> Resultat
              Screen_FenetreClassement()\position + 1 
            EndIf
          Next
          SortStructuredList(Screen_FenetreClassement(), 1, OffsetOf(Screen_FenetreClassementStructure\position), #PB_Sort_Byte)
        EndIf

      EndIf
    EndIf 
  EndIf
  ProcedureReturn Resultat
EndProcedure

Procedure Screen_RefreshWindows()
  Protected *Screen_Fenetre.Screen_FenetreStructure, i
  For i = 0 To CountList(Screen_FenetreClassement()) - 1
    SelectElement(Screen_FenetreClassement(), i)
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Screen_FenetreClassement()\fenetre)  
    If *Screen_Fenetre And *Screen_Fenetre\Hide = 0
      DisplayTransparentSprite(*Screen_Fenetre\Sprite, *Screen_Fenetre\PositionX, *Screen_Fenetre\PositionY)  
    EndIf
  Next i
  ProcedureReturn  0
EndProcedure  

Procedure Screen_EventWindow(Mode.b = 0, Fenetre.l = 0, Event.l = 0)
  Protected Resultat = 0, mouseY, mouseX, BestPosition = 0, mouseState, oldmouseWMPX, oldmouseWMPY, Temp.l , *Screen_Fenetre.Screen_FenetreStructure
  ;Teste si un évènement s'est produit sur chacune des fenêtres ouvertes. Cette fonction est à retour immédiat, les évènements possibles sont : 
  ;#PB_Event_Gadget : Un gadget a été cliqué #PB_Event_MoveWindow : La fenêtre a été déplacée #PB_Event_SizeWindow : La fenêtre a été redimensionnée 
  ;#PB_Event_ActivateWindow : La fenêtre a été activée (focus)
  oldmouseX = ScreenVar(0) 
  oldmouseY = ScreenVar(1)
  oldmouseState = ScreenVar(2)
  If Mode = 0
    mouseY = WindowMouseY(Fenetre)
    mouseX = WindowMouseX(Fenetre)
    Select Event
      Case #WM_LBUTTONDOWN
        mouseState = 1
        oldmouseWMPX = mouseX 
        oldmouseWMPY = mouseY 
      Case #WM_LBUTTONUP
        mouseState = 0
        ScreenVar(3) = 0
        oldmouseWMPX = -1
        oldmouseWMPY = -1 
    EndSelect
  Else  
    mouseY = MouseX()
    mouseX = MouseX()
  EndIf

  
  ;- selection a 0
  Object_EnumerateStart(ScreenFenetreObjects) 
  While Object_EnumerateNext(ScreenFenetreObjects, @Temp) 
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Temp) 
    *Screen_Fenetre\Selected = 0 
  Wend 
  
  
  Object_EnumerateStart(ScreenFenetreObjects) 
  While Object_EnumerateNext(ScreenFenetreObjects, @Temp)
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Temp)  
    ;-on regarde quel fenetre est touché par la souris
    If mouseState = 1 And oldmouseState = 0 
      If mouseX>*Screen_Fenetre\PositionX And mouseY>*Screen_Fenetre\PositionY And mouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And mouseY< *Screen_Fenetre\PositionY+*Screen_Fenetre\TailleY
        If oldmouseX>*Screen_Fenetre\PositionX And oldmouseY>*Screen_Fenetre\PositionY And oldmouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And oldmouseY< *Screen_Fenetre\PositionY+*Screen_Fenetre\TailleY
          *Screen_Fenetre\Selected = 1
        EndIf
      EndIf      
    EndIf
  Wend


  ;-on donne le focus
  ForEach Screen_FenetreClassement()
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Screen_FenetreClassement()\fenetre)  
    If *Screen_Fenetre\Selected = 1
      If BestPosition = 0
        BestPosition = Screen_FenetreClassement()\Position
      Else 
        If Screen_FenetreClassement()\Position < BestPosition
          BestPosition = Screen_FenetreClassement()\Position  
        EndIf
      EndIf
    EndIf
  Next

 
  If BestPosition > 0 
    TempPosition = 1
    ForEach Screen_FenetreClassement()
      *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Screen_FenetreClassement()\fenetre) 
      If Screen_FenetreClassement()\Position = BestPosition
        Screen_FenetreClassement()\Position = 1
        If *Screen_Fenetre\Theme 
          If *Screen_Fenetre\Theme = #PB_Any
            TailleBarreY = 20
          Else 
            ;For i2 = 0 To CountList(Gui_Theme()) - 1
            ;  SelectElement(Gui_Theme(), i2)
            ;  If Gui_Fenetre()\Theme = Gui_Theme()\Nom
            ;    Break
            ;  EndIf
            ;Next i2
          EndIf
          If mouseX>*Screen_Fenetre\PositionX And mouseY>*Screen_Fenetre\PositionY And mouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And mouseY< *Screen_Fenetre\PositionY+TailleBarreY 
            If oldmouseX>*Screen_Fenetre\PositionX And oldmouseY>*Screen_Fenetre\PositionY And oldmouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And oldmouseY< *Screen_Fenetre\PositionY+*Screen_Fenetre\TailleY 
              ScreenVar(3) = *Screen_Fenetre\Numero
              ScreenDecalageselectX = mouseX - *Screen_Fenetre\PositionX 
              ScreenDecalageselectY = mouseY - *Screen_Fenetre\PositionY

            EndIf
          EndIf
        EndIf 
      ElseIf Screen_FenetreClassement()\Position < BestPosition   
        Screen_FenetreClassement()\Position + 1  
      EndIf
    Next
  EndIf
  SortStructuredList(Screen_FenetreClassement(), 1, OffsetOf(Screen_FenetreClassementStructure\position), #PB_Sort_Byte)
  Object_EnumerateStart(ScreenFenetreObjects) 
  While Object_EnumerateNext(ScreenFenetreObjects, @Temp)
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Temp)  
    If *Screen_Fenetre\Theme
      If *Screen_Fenetre\Theme = #PB_Any
        TailleBarreY = 20
      Else 
        ;For i2 = 0 To CountList(Gui_Theme()) - 1
        ;  SelectElement(Gui_Theme(), i2)
        ;  If Gui_Fenetre()\Theme = Gui_Theme()\Nom
        ;    Break
        ;  EndIf
        ;Next i2
      EndIf
    EndIf
    
    ;-on déplace
    If ScreenVar(3) = *Screen_Fenetre\Numero 
      *Screen_Fenetre\PositionX = mouseX - ScreenDecalageselectX
      *Screen_Fenetre\PositionY = mouseY - ScreenDecalageselectY
    EndIf
  Wend
  
  ScreenVar(0) = mouseX 
  ScreenVar(1) = mouseY
  ScreenVar(2) = mouseState
  ProcedureReturn Resultat
EndProcedure

Procedure Screen_GetWindowColor(Fenetre) 
;Le numéro du theme ou du skin actuellement utilisé sera renvoyé dans 'Resultat' 
EndProcedure

Procedure Screen_GetActiveWindow() 
;Renvoie le numéro de la fenêtre active dans 'Resultat' 
EndProcedure

Procedure Screen_GetWindowTitle(Fenetre) 
;Le titre de la fenêtre sera renvoyé dans 'Resultat' 
EndProcedure

Procedure Screen_GetWindowType(Fenetre) 
;Le type de la Fenêtre sera renvoyé dans 'Resultat': 
;#PB_ScreenWindow_Theme : La fenêtre utilise un thème. 
;#PB_ScreenWindow_Skin : La fenêtre utilise un skin. 
EndProcedure

Procedure LoadSkin(Skin,Fichier$,CouleurInvisible,CouleurSeparatrice) 
;Charge un skin en mémoire. 
;Si #PB_Any est utilisé pour le paramètre '#Skin', le numéro de la fenêtre sera renvoyé dans 'Resultat'. 
;La CouleurInvisible ne sera pas affichée. 
;La CouleurSeparatrice sera utiliser pour découper le skin dans l'image (Ca permet une simplification de la création des skins) 
EndProcedure

Procedure Screen_SetWindowType(Fenetre, Type) 
;Change le type de la Fenetre. 
;Les valeurs de Type peuvent être: 
;#PB_ScreenWindow_Theme : La fenêtre utilise un thème. 
;#PB_ScreenWindow_Skin : La fenêtre utilise un skin. 
EndProcedure

Procedure Screen_SetWindowColor(Fenetre, Theme) 
;Change le numéro du skin ou du thème utilisé. 
EndProcedure

Procedure Screen_SetActiveWindow(Fenetre) 
;Active (donne le focus) à la Fenetre 
EndProcedure

Procedure Screen_SetWindowTitle(Fenetre, Titre$) 
;Change le titre de la Fenetre 
EndProcedure


Procedure Createtheme();Arguments à définir)
;Crée un thème en suivant les arguments 
EndProcedure

Procedure Screen_ResizeWindow(Fenetre, X,Y) 
;Redimensionne la Fenetre 
EndProcedure

Procedure Screen_MovesWindow(Fenetre, X,Y) 
;Déplace la Fenetre 
EndProcedure

Procedure Screen_WindowHeight(Fenetre) 
;Renvoie la hauteur en pixels de la Fenetre spécifiée. 
EndProcedure

Procedure Screen_WindowWidth (Fenetre) 
;Renvoie la hauteur en pixels de la Fenetre spécifiée. 
EndProcedure

Procedure Screen_WindowX(Fenetre) 
;Renvoie la position gauche de la Fenetre spécifiée, en pixels. 
EndProcedure

Procedure Screen_WindowY(Fenetre) 
;Renvoie la position haute de la Fenetre spécifiée, en pixels.
EndProcedure
il reste donc a definir les gadgets et les tout les parametres des themes
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Bon aller je vais contribuer en vous donnant gratos (si si je vous jure :D) mes sources de ma librairie BGE et un exmple car en faite en ce moment j'ai laissé tomber le Purebasic pour le C++ donc je vous l'offre car sa serait dommage qu'il ne serve a rien.

http://cameleonth.free.fr/DL/BGE%20V2.pb pour la source et
http://cameleonth.free.fr/DL/example%20v2.pb pour l'exemple.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

News au 10 Juillet ?
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

j'ai eu des petit problems de conection dsl et mon emploie du temp est chargé donc jai jsute eu le temp dadapter la fonction bouton de CameleonTH que je trouve vraimetn sympa.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

me revoila :) desolé de pas avoir donné de nouvelles j'ai été un peu occupé je reprend la suite .
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Juste une suggestion pour le projet, vous pouvez partir de guichan. C'est en gros le même projet, qui se présente sous forme de dll sous windows, le tout codé en C++.

C'est garzul qui m'a fait découvrir, et au lieu d'utiliser les fichiers dll, on peut tout simplement le recoder en PB. En plus c'est autorisé ^^
Guichan comes under the BSD license and there exist a very good reason for the choice of BSD over LGPL (which i believe are the standard licenses for open(free) source library projects). BSD lets you link with Guichan statically or even include all of the source for Guichan into your own project not using any linkage at all (which would violate the LGPL license). We believe this is something users of Guichan might want to do because of our philosophy of using inheritance and function overloading over theme handling.
Pour plus d'info voir ici:
http://guichan.sourceforge.net/

Dri ;)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

@Dri j"arrive pas a comprendre comment les sources sont structurés

l'utilisation des skin est operationel
Un petit Exemple (source medias exectuable)

une ilustration pour les feignants
Image

Edit je vient de remarquer qu'une petit ereur c'est glissé dans une des constante ,elle est meme flagrante sur la screen :oops: .
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Chaos => impossible de voir l'image !
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Serveur Down ....
Répondre