Redimensionnement automatique des gadgets

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Guillot
Messages : 527
Inscription : jeu. 25/juin/2015 16:18

Redimensionnement automatique des gadgets

Message 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
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Redimensionnement automatique des gadgets

Message par Zorro »

Excellent ! :)
le genre de fonctions qui devraient etre inclu d'office dans le langage !
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Redimensionnement automatique des gadgets

Message par JohnJohnsonSHERMAN »

Magnifique :P 8)
Simple, pratique et facile d'usage... parfait pour PB en fait !
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Redimensionnement automatique des gadgets

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Guillot
Messages : 527
Inscription : jeu. 25/juin/2015 16:18

Re: Redimensionnement automatique des gadgets

Message 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
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Redimensionnement automatique des gadgets

Message 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... :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Redimensionnement automatique des gadgets

Message 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 !
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Redimensionnement automatique des gadgets

Message 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)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Redimensionnement automatique des gadgets

Message 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)
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Redimensionnement automatique des gadgets

Message 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 :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Redimensionnement automatique des gadgets

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Redimensionnement automatique des gadgets

Message 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).
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Guillot
Messages : 527
Inscription : jeu. 25/juin/2015 16:18

Re: Redimensionnement automatique des gadgets

Message par Guillot »

mais WindowBounds() fonctionne
pourquoi il fonctionnerai pas ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Redimensionnement automatique des gadgets

Message 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 ;).
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Redimensionnement automatique des gadgets

Message par Ar-S »

Mais j'ai pas dit qu'il ne fonctionnait pas j'ai dit qu'il faudrait l'ajouter à ton exemple.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre