Page 1 sur 1

Domotique, cartes et actions... drag'n drop

Publié : dim. 28/oct./2012 23:24
par Golfy
Bonsoir,

il est tard, peut-être que je bute sur un rien mais je veux placer mes modules domotiques sur des plans. Les dessins de modules font 20x20. Les plans (2 pour le moment car je suis en version alpha :? ) sont au maximum 800x600

Je n'arrive pas à faire du drag'n drop (de la liste de droite vers le plan central)

PS: désolé, le code est crasseux et il n'y a pas de commentaire... je teste juste les fonctions pour préparer un premier programme opérationnel (et voir ce qu'il me manque ou ce que je dois améliorer sur l'interface). Par contre, il ne doit pas nécessiter de connexion, donc est utilisable par tous (pour le moment). :)

Code : Tout sélectionner

Enumeration
	#Et0
	#Et1
	#Et2
	#Et3
	;
	#Bl0
	#Bl1
	#Bl3
	;
	#Re0
	#Re1
	#Re2
	;
	#Dm0
	;
	#Te0
	;
	; Windows
	#Window0
	#B0
	#B1
	#B2
	#B3
	#B_Load
	#B_Save
	#B_Run
	#B_Quit
	#Panel0
	#Panel1
	#Panel2
	#Panel3
	#Canvas0
	#Canvas1
	#Canvas2
	#Canvas3
	#Area
EndEnumeration

;- Structures
Structure Vmsg
	Len.i ; message len
	*cmd  ; message
	time.i; date message
EndStructure

Structure VMB
	ad.i
	part.i
	canvas.i
	nom.s
	x.i
	y.i
	Etat.i
	type.s
EndStructure


UsePNGImageDecoder() 
imgRdC = LoadImage(#Et0,"Domotique - RdC.png")
img1er = LoadImage(#Et1,"Domotique - 1er.png")
bl0    = LoadImage(#Bl0,"i_blind0.png")
bl1    = LoadImage(#Bl1,"i_blind1.png")
Re0    = LoadImage(#Re0,"i_Relay0.png")
Re1    = LoadImage(#Re1,"i_Relay1.png")
Te0    = LoadImage(#Te0,"i_Temp.png")


If OpenWindow(#Window0, 0, 0, 880, 685, "Veltron 0.1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	PanelGadget     (#Panel0, 5, 30, 808, 629)
    AddGadgetItem (#Panel0, -1, "Etage 0")
    	CanvasGadget(#Canvas0, 1, 1, 800, 600)
    AddGadgetItem (#Panel0, -1, "Etage 1")
    	CanvasGadget(#Canvas1, 1, 1, 800, 600)
    AddGadgetItem (#Panel0, -1, "Etage 2")
    	CanvasGadget(#Canvas2, 1, 1, 800, 600)
    AddGadgetItem (#Panel0, -1, "Etage 3")
    	CanvasGadget(#Canvas3, 1, 1, 800, 600)
    CloseGadgetList()
  ;
  ; ListImage
  ScrollAreaGadget(#Area, 815, 55, 62, 605, 62, 6400,#PB_ScrollArea_BorderLess)
  For t = 1 To 255

  	Select Random(4)
  		Case 1
  			;ImageGadget(t+100, 5, t*25, 22, 22, ImageID(#Bl0))
  			ImageGadget(t+100, 5, t*25, 22, 22, #Bl0)
			Case 2
  		ImageGadget(t+100, 5, t*25, 22, 22, ImageID(#Te0))
			Default
  		ImageGadget(t+100, 5, t*25, 22, 22, ImageID(#Re0))
  	EndSelect
    GadgetToolTip(t+100, "Objet N°"+Str(t))
	Next t
  CloseGadgetList()
	; Functions buttons
	ButtonGadget(#B_Load,320,5,65,20,"Load")
	ButtonGadget(#B_Save,390,5,65,20,"Save")
	ButtonGadget(#B_Run,480,5,65,20,"Run",#PB_Button_Toggle)
	; Exit button
	ButtonGadget(#B_Quit,560,5,65,20,"Quit")
	;
	EnableGadgetDrop(#Canvas0,    #PB_Drop_Image,   #PB_Drag_Move)

	
  If StartDrawing(CanvasOutput(#Canvas0))
  	DrawImage(ImageID(#Et0), 0, 0)
  	StopDrawing()
  EndIf
  If StartDrawing(CanvasOutput(#Canvas1))
  	DrawImage(ImageID(#Et1), 0, 0)
  	StopDrawing()
  EndIf
  
  
  InitNetwork()
  If OpenNetworkConnection("192.168.168.250",8080)
  Else
  	; End
  EndIf
  

  Repeat
    Event = WaitWindowEvent(20)
  
    If Event = #PB_Event_Gadget
    	GadgetSelected = EventGadget()
    	EType = EventType()

	  	If EType = #PB_EventType_DragStart
	  		Debug "Hello "+Str(GadgetSelected)+" / "+Str(GetGadgetState(GadgetSelected))
				;DragImage(ImageID(GetGadgetState(GadgetSelected)), #PB_Drag_Move)
	  	EndIf
	  	If EType = #PB_Event_GadgetDrop
	  		Debug "bye"
	  		If StartDrawing(CanvasOutput(#Canvas0))
		  		x = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
		  		y = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
		  		DrawImage(110, x, y)
		  		StopDrawing()
		  	EndIf
	  	EndIf
    EndIf    
    
  Until Event = #PB_Event_CloseWindow
EndIf

;- Procedures
	
Procedure Scan()
	*BTypeQ = AllocateMemory(10)
	*BNameQ = AllocateMemory(10)
	*BResp  = AllocateMemory(4096)
	
EndProcedure


Re: Domotique, cartes et actions... drag'n drop

Publié : lun. 29/oct./2012 7:34
par graph100
Déjà une première remarque, évite les gros If qui englobent tout.
Pour la lisibilité c'est pas top.

ensuite, il faut séparer les différents type de constante. Tu prends de la mémoire pour rien si tu mets tout à la suite (c'est lié au type d'allocation de pb des objets je crois)
ca n'a pas de sens de faire :

Code : Tout sélectionner

Enumeration
	#Et0
	#Et1
	#Et2
	#Et3
	;
	#Bl0
	#Bl1
	#Bl3
	;
	#Re0
	#Re1
	#Re2
	;
	#Dm0
	;
	#Te0
	;
	; Windows
	#Window0
	#B0
	#B1
	#B2
	#B3
	#B_Load
	#B_Save
	#B_Run
	#B_Quit
	#Panel0
	#Panel1
	#Panel2
	#Panel3
	#Canvas0
	#Canvas1
	#Canvas2
	#Canvas3
	#Area
EndEnumeration

Sur la modif que j'ai fait, j'ai remarqué que les tooltip s'affichent correctement. Sur ton code ça se limitait à n°9.

Ensuite, ce que tu mets dans un imagegadget() c'est l'imageID... Pas le numéro PB.
Donc pour le récupérer tu prends direct la valeur de Getgadgetstate()

Et j'ai compris pourquoi tu ne recevais pas le Drop :o

Code : Tout sélectionner

Event = #PB_Event_GadgetDrop
c'est un event, pas un event_type

Et voila le code qui fonctionne.

Code : Tout sélectionner

Enumeration
	#Et0
	#Et1
	#Et2
	#Et3
	;
	#Bl0
	#Bl1
	#Bl3
	;
	#Re0
	#Re1
	#Re2
	;
	#Dm0
	;
	#Te0
	;
	; Windows
	#Window0
	#B0
	#B1
	#B2
	#B3
	#B_Load
	#B_Save
	#B_Run
	#B_Quit
	#Panel0
	#Panel1
	#Panel2
	#Panel3
	#Canvas0
	#Canvas1
	#Canvas2
	#Canvas3
	#Area
	
	#list_icon
EndEnumeration

;- Structures
Structure Vmsg
	Len.i ; message len
	*cmd  ; message
	time.i; date message
EndStructure

Structure VMB
	ad.i
	part.i
	canvas.i
	nom.s
	x.i
	y.i
	Etat.i
	type.s
EndStructure


UsePNGImageDecoder()
imgRdC = LoadImage(#Et0,"Domotique - RdC.png")
img1er = LoadImage(#Et1,"Domotique - 1er.png")
bl0    = LoadImage(#Bl0,"i_blind0.png")
bl1    = LoadImage(#Bl1,"i_blind1.png")
Re0    = LoadImage(#Re0,"i_Relay0.png")
Re1    = LoadImage(#Re1,"i_Relay1.png")
Te0    = LoadImage(#Te0,"i_Temp.png")




If OpenWindow(#Window0, 0, 0, 880, 685, "Veltron 0.1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	PanelGadget     (#Panel0, 5, 30, 808, 629)
	AddGadgetItem (#Panel0, -1, "Etage 0")
	CanvasGadget(#Canvas0, 1, 1, 800, 600)
	AddGadgetItem (#Panel0, -1, "Etage 1")
	CanvasGadget(#Canvas1, 1, 1, 800, 600)
	AddGadgetItem (#Panel0, -1, "Etage 2")
	CanvasGadget(#Canvas2, 1, 1, 800, 600)
	AddGadgetItem (#Panel0, -1, "Etage 3")
	CanvasGadget(#Canvas3, 1, 1, 800, 600)
	CloseGadgetList()
	;
	
	
	; ListImage
	ScrollAreaGadget(#Area, 815, 55, 62, 605, 62, 6400,#PB_ScrollArea_BorderLess)
	
	For t = 1 To 255
		
		Select Random(4)
			Case 1
				tmp_img = #Bl0
				
			Case 2
				tmp_img = #Te0
				
			Default
				tmp_img = #Re0
				
		EndSelect
		
		tmp_img_gadget.l = ImageGadget(#PB_Any, 5, t * 25, 22, 22, ImageID(tmp_img))
		
		GadgetToolTip(tmp_img_gadget, "Objet N°"+Str(t))
	Next t
	
	
	CloseGadgetList()
	
	
	
	; Functions buttons
	ButtonGadget(#B_Load,320,5,65,20,"Load")
	ButtonGadget(#B_Save,390,5,65,20,"Save")
	ButtonGadget(#B_Run,480,5,65,20,"Run",#PB_Button_Toggle)
	; Exit button
	ButtonGadget(#B_Quit,560,5,65,20,"Quit")
	;
	EnableGadgetDrop(#Canvas0,    #PB_Drop_Image,   #PB_Drag_Move)
	
Else
	End
EndIf



If StartDrawing(CanvasOutput(#Canvas0))
	DrawImage(ImageID(#Et0), 0, 0)
	StopDrawing()
EndIf
If StartDrawing(CanvasOutput(#Canvas1))
	DrawImage(ImageID(#Et1), 0, 0)
	StopDrawing()
EndIf


InitNetwork()
If OpenNetworkConnection("192.168.168.250",8080)
Else
	; End
EndIf


; DROPFLAG
Drop_image.l = 0

Repeat
	Event = WaitWindowEvent(20)
	
	If Event = #PB_Event_Gadget
		GadgetSelected = EventGadget()
		EType = EventType()
		
		If Drop_image And GadgetSelected = #Canvas0
			Debug "Drawing to canvas"
			
			If StartDrawing(CanvasOutput(#Canvas0))
				x = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
				y = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
				
				DrawImage(ImageID(Drop_image), x, y)
				StopDrawing()
			EndIf
			
			; remise à zéro
			Drop_image = 0
		EndIf
		
		
		
		If EType = #PB_EventType_DragStart
			Debug "Hello " + Str(GadgetSelected)+" / " + Str(GetGadgetState(GadgetSelected))
			;DragImage(ImageID(GetGadgetState(GadgetSelected)), #PB_Drag_Move)
			
			
			DragImage(GetGadgetState(GadgetSelected),#PB_Drag_Move)
			
			
			
		EndIf
	EndIf   
	
	If Event = #PB_Event_GadgetDrop
		Debug "bye"
		Drop_image = EventDropImage(#PB_Any)
	EndIf
	
	
Until Event = #PB_Event_CloseWindow

;- Procedures

Procedure Scan()
	*BTypeQ = AllocateMemory(10)
	*BNameQ = AllocateMemory(10)
	*BResp  = AllocateMemory(4096)
	
EndProcedure
Perso j'essayerai de ne pas utiliser des centaines de gadgets image, mais plutot une listicon ou un truc du genre. Pour faire des interfaces redimensionnable c'est carrément plus simple.
Désolé si j'ai fait pas mal de commentaire sur le code :P c'est que quand tu prends le temps de regarder, c'est quand même pas facile de rentrer dans le code avec un truc comme ça.

J'espère que ça résout ton pb ? :D

Re: Domotique, cartes et actions... drag'n drop

Publié : lun. 29/oct./2012 22:01
par Golfy
Merci Graph100 : ta réponse est très complète et je te suis reconnaissant du temps que tu passes...
... en même temps, je suis obligé de te demander pourquoi enumeration n'est pas le bon moyen (j'avais lu un post dessus où Fred a fait une réponse mais je n'arrive pas à le retrouver avec Google ou le moteur de recherche purebasic :oops: )

Ceci étant, le choix d'une image plutôt qu'un listicongadget est purement graphique : l'idée sera -- à terme -- de permettre la création de thèmes visuels (fond noir, ou bien façon bleu façon Tron...)
Je suis nul en graphisme mais je suis sûr que d'autres se chargeront de cela... en attendant, voici une capture d'écran de ce que devrait pouvoir être Veltron 0.1 !

Il me manque la procédure de scan (255 éléments max sur un bus), la procédure de nommage (chaque module à un nom qu'il faut lire sur le bus) et la surveillance temps réel de l'état des modules (ou plutôt, la surveillance des trames de changement d'état). Enfin, la gestion du clic sur un module dans le plan pour changer l'état à la souris...
... bref : tu comprends pourquoi la version du programme est 0.1 :roll:

Image

Re: Domotique, cartes et actions... drag'n drop

Publié : mar. 30/oct./2012 5:43
par graph100
ok !
C'est sur qu'avec un plan ça a de la gueule :D Moi j'avais dessiné rapidement des images vilaines pour lancer l'appli.

Pour la numérotation, c'est une histoire d'objets différents.
Les objets fenêtres ne sont pas dans la même liste de ressource que les objets gadgets, images, sprites, sons, timer.... Enfin, bon chaque type d'objets possible.

Il me semble que Fred avait expliqué que chaque liste fonctionne de la manière suivante : si tu définis l'objet par un numéro, alors il est créé dans un genre de tableau.
Donc si tu créés une fenêtre avec le numéro 1000, tu as 999 créneaux vide, qui sont là pour rien.
Et l'autre manière c'est avec #Pb_any, et là les objets sont créés dans une map dynamique avec des numéros qui n'existaient pas avant (d’où l’intérêt quand tu créés des gadgets à la volée).

bonne nuit !

Re: Domotique, cartes et actions... drag'n drop

Publié : mar. 30/oct./2012 11:03
par Ulix
ok !
C'est sur qu'avec un plan ça a de la gueule :D Moi j'avais dessiné rapidement des images vilaines pour lancer l'appli.

Pour la numérotation, c'est une histoire d'objets différents.
Les objets fenêtres ne sont pas dans la même liste de ressource que les objets gadgets, images, sprites, sons, timer.... Enfin, bon chaque type d'objets possible.

Il me semble que Fred avait expliqué que chaque liste fonctionne de la manière suivante : si tu définis l'objet par un numéro, alors il est créé dans un genre de tableau.
Donc si tu créés une fenêtre avec le numéro 1000, tu as 999 créneaux vide, qui sont là pour rien.
Et l'autre manière c'est avec #Pb_any, et là les objets sont créés dans une map dynamique avec des numéros qui n'existaient pas avant (d’où l’intérêt quand tu créés des gadgets à la volée).


Oui !
Je l'est trouvé en faisant des recherches perso. :lol:

A ce post :
http://www.purebasic.fr/french/viewtopi ... ation+fred

A + :wink:

Re: Domotique, cartes et actions... drag'n drop

Publié : mar. 30/oct./2012 19:41
par Golfy
Bien Joué Ulix !!!
Et Graph100 a effectivement raison (et je comprends grace à ce post la raison exacte).

Il faudra maintenant voir si le nouveau visual designer tient compte de cela :roll: