Page 1 sur 2

Redimensionnement automatique des gadgets

Publié : lun. 25/juil./2016 17:04
par Guillot
Salut tout le monde,

j'ai wrapper les fonctions relatives aux gadgets pour permettre leur redimensionnement automatique lors d'un redimensionnement de la fenetre
(y'a pas tout les gadgets, mais vous verrez c'est tres simple d'en rajouter)
ça fonctionne aussi en SB

Code : Tout sélectionner

EnableExplicit

;############################################################################################################################
;                  Redimensionnement automatique des gadgets - pf shadoko - 2016
;
;  fonctionnement:
;  les instructions: OpenWindow, ButtonGadget, TextGadget, ... , CloseGadgetList
;  doivent etre utilisées avec le suffixe 'R'
;  les 2 parametres suplementaires : rx et ry correspondent au type de redimensionnement:
;  rx/ry = 0 : pas de modification
;  rx/ry = 1 : modification de la position x/y
;  rx/ry = 2 : modification de la largeur/hauteur
;  rx/ry = 3 : positionnement proportionnel
; (rx/ry = 4 : positionnement proportionnel d'un coté)
; (rx/ry = 5 : positionnement proportionnel de l'autre coté)
;
;############################################################################################################################

Structure GadgetInfo
  g.i             ;gadgetID
  Map Glist.s()   ;liste des gadgets contenus (pour les containers)
  x.w:  y.w       ;position d'origine
  dx.w: dy.w      ;dimension d'origine
  rx.b : ry.b     ;type de redimensionnement
EndStructure

Global Dim GadgetCont.s(256), GadgetConti
Global NewMap GadgetList.GadgetInfo()

Procedure Redimensioner(c, nx, ny, ndx, ndy, t.s="G")
  Protected.w ox1,oy1, ox2,oy2, x1,y1, x2,y2
  Protected gi.GadgetInfo, o.GadgetInfo,  adx,ady,  r.f,d.w 
  Macro RedimensionerD(t, v1, V2, oV1, oV2, adV, ndV)
    d = ndV - adV
    r = ndV / adV
    Select t
      Case 0: v1 = oV1:       V2 = oV2
      Case 1: v1 = oV1 + d:   V2 = oV2 + d
      Case 2: v1 = oV1:       V2 = oV2 + d
      Case 3: v1 = oV1 * r:   V2 = oV2 * r
      Case 4: v1 = oV1:       V2 = oV2 * r
      Case 5: v1 = oV1 * r:   V2 = oV2 + d
    EndSelect
  EndMacro
  gi=GadgetList(t+Str(c))
  adx = gi\dx
  ady = gi\dy
  ForEach gi\Glist():o=GadgetList(gi\Glist())
       If (o\rx Or o\ry)
           ox1 = o\x: ox2 = ox1 + o\dx: RedimensionerD (o\rx, x1, x2, ox1, ox2, adx, ndx)
           oy1 = o\y: oy2 = oy1 + o\dy: RedimensionerD (o\ry, y1, y2, oy1, oy2, ady, ndy)
           Redimensioner (o\g, x1, y1, x2 - x1, y2 - y1)
       EndIf
  Next
  If t="G":ResizeGadget(c,nx, ny, ndx, ndy):EndIf
EndProcedure

Procedure GadgetInfo(na,n,x.w,y.w,dx.w,dy.w,rx.b,ry.b,iscontainer=0)
  Protected gi.GadgetInfo, tg.s
  With gi
    If n=-1:\g=na:Else:\g=n:EndIf
    \x=x: \dx=dx: \rx=rx
    \y=y: \dy=dy: \ry=ry
    If iscontainer=-1
      tg="W"+Str(\g):GadgetConti=0 
    Else
      tg="G"+Str(\g):GadgetList(GadgetCont(GadgetConti))\Glist(tg)=tg
    EndIf
    GadgetList(tg)=gi
    If iscontainer:GadgetConti+1:GadgetCont(GadgetConti)=tg :EndIf
    ProcedureReturn \g
  EndWith
EndProcedure

;--------------------------------- gadgets
Procedure ButtonGadgetR(n,x,y,dx,dy,txt.s,f=0,rx=0,ry=0)
  Protected na=ButtonGadget(n,x,y,dx,dy,txt,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry)
EndProcedure

Procedure TextGadgetR(n,x,y,dx,dy,txt.s,f=0,rx=0,ry=0)
  Protected na=TextGadget(n,x,y,dx,dy,txt,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry)
EndProcedure

Procedure CheckBoxGadgetR(n,x,y,dx,dy,txt.s,f=0,rx=0,ry=0)
  Protected na=CheckBoxGadget(n,x,y,dx,dy,txt,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry)
EndProcedure

Procedure StringGadgetR(n,x,y,dx,dy,txt.s,f=0,rx=0,ry=0)
  Protected na=StringGadget(n,x,y,dx,dy,txt,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry)
EndProcedure

Procedure EditorGadgetR(n,x,y,dx,dy,f=0,rx=0,ry=0)
  Protected na=EditorGadget(n,x,y,dx,dy,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry)
EndProcedure

Procedure ButtonImageGadgetR(n,x,y,dx,dy,imageID,f=0,rx=0,ry=0)
  Protected na=ButtonImageGadget(n,x,y,dx,dy,imageID,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry)
EndProcedure

;--------------------------------- containers
Procedure ContainerGadgetR(n,x,y,dx,dy,f=0,rx=0,ry=0)
  Protected na=ContainerGadget(n,x,y,dx,dy,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry,1)
EndProcedure

Procedure PanelGadgetR(n,x,y,dx,dy,rx=0,ry=0)
  Protected na=PanelGadget(n,x,y,dx,dy)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry,1)
EndProcedure

Procedure ScrollAreaGadgetR(n,x,y,dx,dy,scrolldx,scrolldy,scrollstep,f=0,rx=0,ry=0)
  Protected na=ScrollAreaGadget(n,x,y,dx,dy,scrolldx,scrolldy,scrollstep,f)
  ProcedureReturn GadgetInfo(na,n,x,y,dx,dy,rx,ry,1)
EndProcedure

;--------------------------------- window
Procedure WindowResizeEvent()
  Protected n=EventWindow()
  Redimensioner(n,0,0,WindowWidth(n), WindowHeight(n),"W")
EndProcedure

Procedure OpenWindowR(n,x,y,dx,dy,txt.s,f=#PB_Window_SystemMenu,pid=0)
  Protected na=OpenWindow(n,x,y,dx,dy,txt,f,pid)
  Protected nw=GadgetInfo(na,n,x,y,dx,dy,2,2,-1)
  BindEvent(#PB_Event_SizeWindow,@WindowResizeEvent(), nw)
  ProcedureReturn nw
EndProcedure

;---------------------------------
Procedure CloseGadgetListR() 
  CloseGadgetList()
  GadgetConti-1
EndProcedure

;############################################################################################################################
;                                                 Exemple
;############################################################################################################################


CreateImage(0,200,60):StartDrawing(ImageOutput(0)):Define i:For i=0 To 200:Circle(100,30,200-i,(i+50)*$010101):Next:StopDrawing()

;OpenWindowr(0, 0, 0,512, 200, "Resize gadget", #PB_Window_Background) 
OpenWindowR(0, 0, 0, 512, 200, "Resize gadget",#PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget) 
;OpenWindowr(0, 0, 0, 512, 200, "Resize gadget", #PB_Window_Maximize | #PB_Window_SizeGadget| #PB_Window_MaximizeGadget) 


  TextGadgetR(1, 10,  10, 200, 50, "Redimentionnez la fenetre, les gadgets seront automatiquement redimentionnés",#PB_Text_Center)
  ButtonImageGadgetR(3, 10, 70, 200, 60, ImageID(0),0,0,0)
    EditorGadgetR(2, 10,  140, 200, 20, 0,0,2):SetGadgetText(2,"Editor")
    ButtonGadgetR(4, 10, 170, 490, 20, "Button / toggle", #PB_Button_Toggle,2,1)
   TextGadgetr(5,220,10,190,20,"Text",#PB_Text_Center,2,0):SetGadgetColor(5, #PB_Gadget_BackColor, $00FFFF)
   ContainerGadgetR(6, 220, 30, 190, 100,#PB_Container_Single,2,2):SetGadgetColor(6, #PB_Gadget_BackColor, $cccccc) 
     EditorGadgetR(7, 10,  10, 170, 50, 0,2,2):SetGadgetText(7,"Editor")
     ButtonGadgetR(8, 10, 70, 80, 20, "Button",0,4,1) 
     ButtonGadgetR(9, 100, 70, 80, 20, "Button",0,5,1) 
   CloseGadgetListR() 
   StringGadgetR(10, 220,  140, 190, 20, "String",0,2,1)
   ButtonGadgetR(11, 420,  10, 80, 80, "Bouton",0,1,2)
   CheckBoxGadgetR(12, 420,  90, 200, 20, "CheckBox",0,1,1)
   CheckBoxGadgetR(13, 420,  110, 200, 20, "CheckBox",0,1,1)
   CheckBoxGadgetR(14, 420,  130, 200, 20, "CheckBox",0,1,1)
   CheckBoxGadgetR(15, 420,  150, 200, 20, "CheckBox",0,1,1)

ResizeWindow(0, #PB_Ignore , #PB_Ignore ,512,400):

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Redimensionnement automatique des gadgets

Publié : lun. 25/juil./2016 17:12
par Zorro
Excellent ! :)
le genre de fonctions qui devraient etre inclu d'office dans le langage !

Re: Redimensionnement automatique des gadgets

Publié : lun. 25/juil./2016 17:53
par JohnJohnsonSHERMAN
Magnifique :P 8)
Simple, pratique et facile d'usage... parfait pour PB en fait !

Re: Redimensionnement automatique des gadgets

Publié : lun. 25/juil./2016 18:36
par falsam
Pas mal du tout Guillot
Les instructions: OpenWindow, ButtonGadget, TextGadget, ... , CloseGadgetList doivent etre utilisées avec le suffixe 'R'.
On n'est pas obligé de procéder de cette maniére. Il suffit d'ajouter par exemple pour ButtonGadgetR une macro comme celle-çi pour que cette contrainte soir résolu.

Code : Tout sélectionner

Macro ButtonGadget : ButtonGadgetR : EndMacro
Merci pour ce partage.

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 11:09
par Guillot
à zorro:
ouai, d'autant que ce serait encore plus simple si c'était intégré à PB
ici je dois reconstruire la liste des gadgets contenu dans les containers
PB ne propose pas d'instruction pour accéder au contenu de cette liste (ou alors pas trouvé...)
ici, pour bien faire, je devrai mettre à jour cette (ou plutot 'ces') liste lors de la supression des gadgets
je pense qu'il y a encore pas mal de boulot pour prendre en compte tout les cas de figure
(j'ai à peine testé mon code)

à falsam:
ok, donc les macros sont prioritaire sur les instructions de base, je le note
ici, c'est un peu tot pour substituer mes fonctions à celles d'origine

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 11:51
par Zorro
Guillot a écrit :ici, c'est un peu tot pour substituer mes fonctions à celles d'origine
oui meme si c'est possible, je ne conseille pas cette façon de faire
on doit pouvoir identifier qu'elles fonctions on utilise ...
melanger les genres c'est cause de confusion :)
ici je dois reconstruire la liste des gadgets contenu dans les containers
PB ne propose pas d'instruction pour accéder au contenu de cette liste (ou alors pas trouvé...)
a part tester si un gadget existe avec : IsGadget(gadget) , je ne vois pas non plus ...
la solution, c'est de tenir a jour la liste des gadgets toi meme avec une Global Liste (Liste chainée...linkedList)
ou Structure... :)

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 11:53
par falsam
Zorro a écrit :melanger les genres c'est cause de confusion
Si on reste dans le cadre des gadgets je ne vois pas pourquoi. Ce n'est qu'une macro !

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 11:56
par Zorro
pour une raison de visibilité !

la le code est simple, une serie de procedures

mais s'il commence a vouloir en faire une librairie type Tailbite , on est mal !!
je verrai bien d'ailleurs la transformation en Module

pas de confusion possible dans ce cas :)
(G... pour Guillot )

Code : Tout sélectionner

G::CheckBoxGadget(12, 420,  90, 200, 20, "CheckBox",0,1,1)

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 15:39
par Marc56
Guillot a écrit : j'ai wrapper les fonctions relatives aux gadgets pour permettre leur redimensionnement automatique lors d'un redimensionnement de la fenetre
(y'a pas tout les gadgets, mais vous verrez c'est tres simple d'en rajouter)
ça fonctionne aussi en SB
C'est impressionnant en rapidité d'exécution 8O et en "simplicité" de code: pas de Peek, Poke, d'API, de lib externe rien que du PureBasic :!:
Admirable de voir que tous les objets sont redimensionnés en temps réel et non pas juste quand on relâche la souris.

Chapeau! 8)

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 16:37
par Zorro
Marc56 a écrit : C'est impressionnant en rapidité d'exécution 8O et en "simplicité" de code: pas de Peek, Poke, d'API, de lib externe rien que du
c'est surtout du a l'apparition de la commande "BindEvent()"
avant ça, je pense que c'etait CallBack() obligatoire :)

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 18:07
par falsam
Zorro a écrit :c'est surtout du a l'apparition de la commande "BindEvent()"
C'est une fonction qui est apparu avec la version 5.30 de Purebasic si je me souviens bien.

En 2012 j'avais produit un code pour faire un resize global d'une fenêtre mais sans passer la création de nouveau gadget.

Je ne rentre pas dans les explications.
Topic et download : http://www.purebasic.fr/french/viewtopi ... =6&t=13161

Re: Redimensionnement automatique des gadgets

Publié : mar. 26/juil./2016 19:03
par Ar-S
Très bon code.
Il ne manque plus qu'un WindowBounds() pour limiter la taille min/max (surtout min pour éviter la superposition de gadget si on reduit trop en verticale par ex).

Re: Redimensionnement automatique des gadgets

Publié : mer. 27/juil./2016 9:04
par Guillot
mais WindowBounds() fonctionne
pourquoi il fonctionnerai pas ?

Re: Redimensionnement automatique des gadgets

Publié : mer. 27/juil./2016 9:28
par blendman
ça marche nickel (cet exemple). Il faudrait que je teste ça avec une interface plus complexe, mais c'est déjà vraiment pas mal.
Windowbounds() fonctionne sans problème effectivement ;).

Re: Redimensionnement automatique des gadgets

Publié : mer. 27/juil./2016 10:52
par Ar-S
Mais j'ai pas dit qu'il ne fonctionnait pas j'ai dit qu'il faudrait l'ajouter à ton exemple.