Page 1 sur 1

ListIcongadget - griser le case à cocher

Publié : sam. 19/févr./2022 16:39
par Bmld76
Bonjour,

Je programme avec Purebasic sous MacOs depuis quelques mois et j'arrive à trouver les réponses à mes problèmes, mais la je cale. Je voudrais griser les cases à cocher d'une ListIcingadget pour les désactiver. J'ai utiliser DisableGadget (#ListIcongadget), mais toutes la liste devient inactive et pas très pratique à utiliser.

Autre problème, est-il possible d'avoir un event lorsque l'on clique sur un titre d'une ListIcongadget pour déclencher un trie par exemple.

Merci d'avance si vous avez une solution ou une piste.

Bien Cordialement

Re: ListIcongadget - griser le case à cocher

Publié : sam. 19/févr./2022 18:25
par Ar-S
Bonjour,
Pourrais tu poster un bout de code stp ?.

Re: ListIcongadget - griser le case à cocher

Publié : sam. 19/févr./2022 19:49
par Bmld76
Bonsoir,
Merci pour ta réponse.
Voici un code, donc quand on valide le bouton verrouille 1, j'aimerais simplement griser les checkbox , et non tout le texte, ou invalider le changement d'état des checkbox, même si celui-ci n'est pas traité en EventGadget;

Code : Tout sélectionner

If OpenWindow(1, 100, 100, 600, 200, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(0, 5, 5, 590, 140, "Name", 100,#PB_ListIcon_CheckBoxes)
  AddGadgetColumn(0, 1, "Address", 250)
  AddGadgetItem(0, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
  AddGadgetItem(0, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")
  ButtonGadget(10, 20 , 160  , 100, 30, "verrouille 1",#PB_Button_Toggle  ) 
  Repeat
    Event = WaitWindowEvent()
    Gadget = EventGadget()
    
    Select Gadget
      Case  10
        If  GetGadgetState(Gadget) = 1
          DisableGadget(0,#True) 			; de préférence  invalider uniquement le changement d'état des checkbox
        Else
          DisableGadget(0,#False)
        EndIf
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
EndIf
Bien cordialement

Re: ListIcongadget - griser le case à cocher

Publié : dim. 20/févr./2022 11:23
par Ar-S
Je ne suis pas sur que tu y arrives nativement.
Par contre tu peux gruger avec des checkboxgadget. C'est pas ultra propre mais c'est une solution possible si tu n'en trouves pas d'autres.

Code : Tout sélectionner

If OpenWindow(1, 100, 100, 600, 200, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(0, 15, 5, 570, 140, "Name", 100)
  AddGadgetColumn(0, 1, "Address", 250)
  AddGadgetItem(0, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
  AddGadgetItem(0, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")
  ButtonGadget(10, 20 , 160  , 100, 30, "verrouille 1",#PB_Button_Toggle  ) 
  CheckBoxGadget(1, 1,  30,10, 20, "")
  CheckBoxGadget(2, 1,  50,10, 20, "")
  
  Repeat
    Event = WaitWindowEvent()
    Gadget = EventGadget()
    
    Select Gadget
      Case  10
        If  GetGadgetState(Gadget) = 1
            DisableGadget(1,#True) 			
            DisableGadget(2,#True)
        Else
            DisableGadget(1,#False)
            DisableGadget(2,#False)
        EndIf
    EndSelect

  Until Event = #PB_Event_CloseWindow
EndIf
Une autre solution plus graphique serait d'utiliser un canvas pour te créer une liste gadget personnalisable.

Re: ListIcongadget - griser le case à cocher

Publié : dim. 20/févr./2022 12:00
par Bmld76
Bonjour,

Merci pour ces pistes, je me doutais que si je ne trouve pas sur les forums, ce n'est certainement pas possible.

En solution , pour verrouiller mais laisser l'affichage tel quel , lors un changement d'état de la checkbox, je raffarichie la liste tel quel donc la checkbox ne change pas en apparence. L'effet est correct.

Bien cordialement

Re: ListIcongadget - griser le case à cocher

Publié : dim. 20/févr./2022 12:04
par Bmld76
Je viens de tester ton code, et ta solution me plait bien également.

cordialement

Re: ListIcongadget - griser le case à cocher

Publié : dim. 20/févr./2022 12:23
par Bmld76
Suite si cela intéresse quelqu'un ...

J'ai adapté la solution de Ar-S avec une 2eme ListeIconGadget ne contenant que des checkbox , plus facile pour aligner et certainement plus facile pour la gestion des événements.

Code : Tout sélectionner

If OpenWindow(1, 100, 100, 600, 200, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(0, 40, 5, 570, 140, "Name", 100)
  ListIconGadget(11, 6, 5, 35, 140, "P", 20,#PB_ListIcon_CheckBoxes)
  AddGadgetColumn(0, 1, "Address", 250)
  AddGadgetItem(0, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
  AddGadgetItem(0, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")
  ButtonGadget(10, 20 , 160  , 100, 30, "verrouille 1",#PB_Button_Toggle  ) 
  AddGadgetItem(11, -1, "")
  AddGadgetItem(11, -1, "")
  TextGadget(#PB_Any,15,12,20, 20,"P")  

  
  Repeat
    Event = WaitWindowEvent()
    Gadget = EventGadget()
    
    Select Gadget
      Case  10
        If  GetGadgetState(Gadget) = 1
            DisableGadget(11,#True) 			
        Else
            DisableGadget(11,#False)
        EndIf
    EndSelect

  Until Event = #PB_Event_CloseWindow
EndIf

Re: ListIcongadget - griser le case à cocher

Publié : dim. 20/févr./2022 20:47
par Ar-S
Effectivement c'est plus simple pour aligner. L'intérêt des checkbox c'est dans le cas ou tu ne souhaite disable que certaines d'entre elles.

Re: ListIcongadget - griser le case à cocher

Publié : jeu. 24/févr./2022 17:47
par Mesa
On peut utuiliser l'astuce des images.

Code : Tout sélectionner

;
;Mesa February 2022


Enumeration imagecheckbox
	#imCheckNo
	#imCheckYes
	#imCheckNoGray
	#imCheckYesGray
EndEnumeration

Enumeration gadget
	#listicon
	#btnlock
EndEnumeration

CreateImage(#imCheckNo,16,16,24,#White)
StartDrawing(ImageOutput(#imCheckNo))
DrawingMode(#PB_2DDrawing_Outlined )
Box(1,1,15,15,#Black)
StopDrawing()

CreateImage(#imCheckYes,16,16,24,#White)
StartDrawing(ImageOutput(#imCheckYes))
DrawingMode(#PB_2DDrawing_Outlined )
Box(1,1,15,15,#Black)
LineXY(1,1,15,15,#Black)
LineXY(15,1,1,15,#Black)
StopDrawing()

CreateImage(#imCheckNoGray,16,16,24,#Gray)
StartDrawing(ImageOutput(#imCheckNoGray))
DrawingMode(#PB_2DDrawing_Outlined )
Box(1,1,15,15,#Black)
StopDrawing()

CreateImage(#imCheckYesGray,16,16,24,#Gray)
StartDrawing(ImageOutput(#imCheckYesGray))
DrawingMode(#PB_2DDrawing_Outlined )
Box(1,1,15,15,#Black)
LineXY(1,1,15,15,#Black)
LineXY(15,1,1,15,#Black)
StopDrawing()

Global Dim checkstate(1)
ItemHeight = 18 ; Change this value if you change the fontsize of the listicongadget

If OpenWindow(0, 100, 100, 600, 200, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ListIconGadget(#listicon, 40, 5, 470, 140, "Name", 100)
	
	AddGadgetColumn(#listicon, 1, "Address", 250)
	
	margin$=" "
	For i=0 To 50
		AddGadgetItem(#listicon, -1, margin$+"Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay",ImageID(#imCheckNo))
		AddGadgetItem(#listicon, -1, margin$+"Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity",ImageID(#imCheckNo))
	Next i
	
	ReDim checkstate(CountGadgetItems(#listicon))
	ButtonGadget(#btnlock, 20 , 160  , 100, 30, "Lock",#PB_Button_Toggle  ) 
	
	gadgetx = GadgetX(#listicon,#PB_Gadget_ScreenCoordinate)
	gadgety = GadgetY(#listicon,#PB_Gadget_ScreenCoordinate) 
	
	AddWindowTimer(0,125,10)
	
	Repeat
		
		Select WaitWindowEvent(1)
				
			Case #PB_Event_CloseWindow
				Quit = 1
				
			Case #PB_Event_Timer 
				If flag = 1
					checkx = DesktopMouseX()
					checky = DesktopMouseY()
					If checkx > gadgetx And checkx < (gadgetx+ItemHeight)
						item = Int((checky - gadgety - ItemHeight)/ItemHeight)
						itemstste = GetGadgetItemState(#listicon,item)      
						checkstate(item) = checkstate(item)!1
						If checkstate(item) = #PB_ListIcon_Selected 
							count + 1
							SetGadgetItemImage(#listicon, item, ImageID(#imCheckYes))
						Else
							count - 1
							SetGadgetItemImage(#listicon, item, ImageID(#imCheckNo))
						EndIf
					EndIf
					If count <> oldcount
						Debug "Item : "+Str(item)+" Checkbox state has changed "
					EndIf        
					oldcount = count
					flag = 0
				EndIf    
				
			Case #PB_Event_Gadget
				
				Select EventGadget()
					Case #listicon				
						Select EventType()                   
							Case #PB_EventType_LeftClick
								If GetGadgetState(#btnlock)=0	
									; if not locked	
									flag = 1
								EndIf
						EndSelect 						
						
					Case  #btnlock
						;If this button is toggled, it's not allowed to check or uncheck anything and checkboxes are grayed
						;else checkboxes are enabled and white
						Select EventType()
							Case #PB_EventType_LeftClick
								
								If GetGadgetState(#btnlock)=1
									im0=#imCheckNoGray
									im1=#imCheckYesGray
								Else
									im0=#imCheckNo
									im1=#imCheckYes
								EndIf
								
								For i=0 To CountGadgetItems(#listicon) -1
									If checkstate(i)=0
										SetGadgetItemImage(#listicon, i, ImageID(im0))
									Else
										SetGadgetItemImage(#listicon, i, ImageID(im1))
									EndIf
								Next i
								
						EndSelect					
						
				EndSelect
				
		EndSelect
		
	Until Quit = 1
EndIf
Pour info, sans timer, ça ne marche pas bien.

M.