Page 1 sur 1

Proposition d'uniformisation des gadgets customs

Publié : dim. 20/janv./2013 18:44
par poshu
Bonjour tout le monde o/

Depuis l'arrivée du canvas, on a vu fleurir des gadgets customs plus ou moins réussi sur les forums; longtemps l'apanage de Windows, il est maintenant facile de créer ses propres gadgets cross-platform, ce qui est une bonne chose. Il y a -d'après moi- tout de même un problème: l'absence de norme, et du coup un grand nombre de fonctions redondantes qui remplissent la fenêtre d'autocomplétion pour peu que l'on utilise plusieurs de ces gadgets dans le même projet.

Hors donc, voilà une proposition d'uniformisation des gadgets customs que je soumet à votre jugement. L'idée générale est d'avoir la même série de commandes que pour les gadgets "officiels": AddGadgetItem(), SetGadgetColor(), ResizeGadget(), tout ça tout ça...
Bref, le concept est très simple et les retouches sur un gadget existant sont faisables assez vite (pour l'exemple, j'ai converti le speedbar gadget de MetalOS en une vingtaine de minutes)

Il s'agit d'un simple test pour voir si mon idée fonctionnait, il reste plein de choses à faire, mais j'aimerais savoir si vous voyez un intérêt à ce concept, ou si vous avez d'autres idées...

L'archive, avec CGH et le speedbar gadget converti pour utiliser les commandes CGH.

Re: Proposition d'uniformisation des gadgets customs

Publié : dim. 20/janv./2013 21:33
par poshu
Une petite mise à jour avec le Tabbar gadget de STARGÅTE porté à la va vite: 19 fonctions redondantes éliminées en 5 minutes de travail.

Archive ici, bon, après j'ai pas tout testé, possible que ça merde dans un coin, mais l'exemple d'origine fonctionne.

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 0:44
par Ar-S
Une bonne idée poshu.
J'ai un Invalid Access Memory dans le speedgadget.pbi Ligne 114 (PB 5.00)

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 10:36
par falsam
Même message qu'Ar-s

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 10:48
par poshu
à la ligne 114?

Code : Tout sélectionner

Procedure _SpeedBarGetAttribute(Gadget, Attribute)
Va me falloir un poil plus d'info pour le coup.

Je suis sous ubuntu 12.04 en 5.10b4 et je n'ai aucun IMA :/

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 13:45
par Ar-S
Je testerai plus avant lors de la release final de PB 5.10

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 18:21
par graph100
Poshu : je t'invite à aller voir ce lien : Custom Gadget
qui présente un boulot que j'ai commencé, mais malheureusement pas tout à fait fini, faute de temps.
En revanche, la plupart des gadgets implémentés sont fonctionnels, et le topic n'est plus à jour concernant les dernières modifications que j'ai effectué (elles sont normalement indiquées dans l'archive.)

voici un exemple d'intégration d'un gadget dans mon projet :

Code : Tout sélectionner

;- ###########
;####################################################
;-  Include de PBGadget - Graph100
;{###################################################
;- ###########



;{ Public procedures

; Ajoute un gadget normal de PB dans la gestion des evenements de CG_CustomGadget. A utiliser pour les redimentionnements automatiques, et le positionnement sur les splitters et container
Procedure CG_PBGadget(Gadget, ParentWindow, Anchor.b = #CG_Anchor_None, Dock.b = #CG_Dock_None, IfInGadget_ParentGadget = -1)
	Protected *obj.ICG_CustomGadget_base
	
	If IsWindow(ParentWindow)
		
		; on ajoute ca pour eviter les problèmes d'affichage lors d'un redimensionnement
		CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			SmartWindowRefresh(ParentWindow, #True)
		CompilerEndIf
		
		; teste si le gadget parent, si spécifié, existe vraiment
		If IfInGadget_ParentGadget <> -1 And IsGadget(IfInGadget_ParentGadget) = 0
			IfInGadget_ParentGadget = -1
		EndIf
		
		
		; si le gadget existais déjà, on libère les ressources
		If FindMapElement(ICG_Var_Global\Gadget(), Str(Gadget))
			CG_FreeGadget(Gadget)
		EndIf
		
		
		; on gère le #pb_any : le gadget PB doit d'abord avoir été créé donc il ne faut pas utiliser #pb_any !!
		If Gadget = #PB_Any : ProcedureReturn 0 : EndIf
		
		; création de l'objet PBgadget
		*obj = AllocateMemory(SizeOf(ICG_CustomGadget_base))
		*obj\_Function = *obj
		*obj\zz_FunctionTable = ?VTable_PBGadget
		
		
		; si echec d'allocation mémoire
		If *obj = 0
			ProcedureReturn 0
		EndIf
		
		; initialisation de la mémoire du nouvel objet
		InitializeStructure(*obj, ICG_CustomGadget_base)
		
		With *obj
			\Gadget = Gadget
			\GadgetType = #CG_GadgetType_PB
			
			\ParentWindow = ParentWindow
			\ParentGadget = IfInGadget_ParentGadget
			
			\x = GadgetX(Gadget)
			\y = GadgetY(Gadget)
			\Width = GadgetWidth(Gadget)
			\Height = GadgetHeight(Gadget)
			
			; vérification des paramètres de dock
			If Dock & #CG_Dock_Top = #CG_Dock_Top
				Dock = #CG_Dock_Top
			ElseIf Dock & #CG_Dock_Bottom = #CG_Dock_Bottom
				Dock = #CG_Dock_Bottom
			ElseIf Dock & #CG_Dock_Left = #CG_Dock_Left
				Dock = #CG_Dock_Left
			ElseIf Dock & #CG_Dock_Right = #CG_Dock_Right
				Dock = #CG_Dock_Right
			ElseIf Dock & #CG_Dock_Fill = #CG_Dock_Fill
				Dock = #CG_Dock_Fill
			Else
				Dock = #CG_Dock_None
			EndIf
			
			\Dock_type = Dock
			
			\Anchor_type = Anchor
			
			\Anchor_Margin_Top = \y
			\Anchor_Margin_Left = \x
			
			If IfInGadget_ParentGadget <> -1
				\Anchor_Margin_Right = GadgetWidth(IfInGadget_ParentGadget) - (\x + \Width)
				\Anchor_Margin_Bottom = GadgetHeight(IfInGadget_ParentGadget) - (\y + \Height)
			Else
				\Anchor_Margin_Right = WindowWidth(ParentWindow) - (\x + \Width)
				\Anchor_Margin_Bottom = WindowHeight(ParentWindow) - (\y + \Height)
			EndIf
			
		EndWith
		
		
		
		; Fin de la création du gadget
		; on l'ajoute dans la liste des gadgets customisés pour le traitement des evenements
		
		ICG_AddCustomGadget(*obj)
		
		ProcedureReturn Gadget
	EndIf
	
	ProcedureReturn 0
EndProcedure


;}


;{ Internal procedures
;-

Procedure ICG_PBGadget_ProcessEvent(*obj.ICG_CustomGadget_base, event_type)
	
EndProcedure

Procedure ICG_PBGadget_Render(*obj.ICG_CustomGadget_base)
	
EndProcedure


;}


;{ Internal common procedure


Procedure ICG_PBGadget_ResizeGadget(*obj.ICG_CustomGadget_base, x, y, width, height)
	*obj\x = x
	*obj\y = y
	*obj\Width = width
	*obj\Height = height
	
	ResizeGadget(*obj\Gadget, x, y, width, height)
EndProcedure


Procedure ICG_PBGadget_SetGadgetState(*obj.ICG_CustomGadget_base, State)
	SetGadgetState(*obj\Gadget, State)
EndProcedure


Procedure.i ICG_PBGadget_GetGadgetAttribute(*obj.ICG_CustomGadget_base, Attribute)
	ProcedureReturn GetGadgetAttribute(*obj\Gadget, Attribute)
EndProcedure

Procedure ICG_PBGadget_SetGadgetAttribute(*obj.ICG_CustomGadget_base, Attribute, Value.i)
	SetGadgetAttribute(*obj\Gadget, Attribute, Value)
EndProcedure


Procedure ICG_PBGadget_DisableGadget(*obj.ICG_CustomGadget_base, State)
	
EndProcedure


Procedure ICG_PBGadget_SetGadgetText(*obj.ICG_CustomGadget_base, Text.s)
	SetGadgetText(*obj\Gadget, Text)
EndProcedure

Procedure.s ICG_PBGadget_GetGadgetText(*obj.ICG_CustomGadget_base)
	ProcedureReturn GetGadgetText(*obj\Gadget)
EndProcedure


Procedure ICG_PBGadget_AddGadgetItem(*obj.ICG_CustomGadget_base, Position, Text.s, FrontColor.l, Image.l, Redraw.b)
	AddGadgetItem(*obj\Gadget, Position, Text, Image)
EndProcedure

Procedure ICG_PBGadget_RemoveGadgetItem(*obj.ICG_CustomGadget_base, Position, Redraw.b)
	RemoveGadgetItem(*obj\Gadget, Position)
EndProcedure

Procedure ICG_PBGadget_ClearGadgetItem(*obj.ICG_CustomGadget_base)
	ClearGadgetItems(*obj\Gadget)
EndProcedure


Procedure ICG_PBGadget_FreeGadget(*obj.ICG_CustomGadget_base)
	FreeGadget(*obj\Gadget)
	FreeMemory(*obj)
EndProcedure


;}



DataSection
	VTable_PBGadget:
	Data.i	@ICG_PBGadget_ProcessEvent(), @ICG_PBGadget_Render()
	Data.i	@ICG_PBGadget_ResizeGadget(), @ICG_PBGadget_SetGadgetState(), @ICG_PBGadget_GetGadgetAttribute(), @ICG_PBGadget_SetGadgetAttribute()
	Data.i	@ICG_PBGadget_DisableGadget(), @ICG_PBGadget_SetGadgetText(), @ICG_PBGadget_GetGadgetText(), @ICG_PBGadget_AddGadgetItem(), @ICG_PBGadget_RemoveGadgetItem(), @ICG_PBGadget_ClearGadgetItem()
	Data.i	@ICG_PBGadget_FreeGadget()
EndDataSection



;-
;}####################################################
Le principe ressemble à de la programmation orientée objet (il me semble), ou tout fonctionne avec un pointeur vers l'objet gadget qui regroupe toutes les fonctions qui peuvent agir dessus.
Mais dans le code on n'appelle pas ces fonctions par l'intermédiaire du pointeur, mais avec les fonctions suivante :

Code : Tout sélectionner

Declare CG_ResizeGadget(Gadget, x, y, width, height, *adresse_customgadget.ICG_CustomGadget_base = -1)

Declare CG_GetGadgetState(Gadget)
Declare CG_SetGadgetState(Gadget, State.l)

Declare CG_GetGadgetAttribute(Gadget, Attribute)
Declare CG_SetGadgetAttribute(Gadget, Attribute, Value)

Declare CG_DisableGadget(Gadget, State.b)
Declare.b CG_IsDisableGadget(Gadget)

Declare CG_SetGadgetText(Gadget, Text.s)
Declare.s CG_GetGadgetText(Gadget)

Declare CG_AddGadgetItem(Gadget, Position, Text.s, FrontColor.l, Image.l = -1, Redraw.b = #True)
Declare CG_RemoveGadgetItem(Gadget, Position, Redraw.b = #True)
Declare CG_ClearGadgetItem(Gadget)

Declare CG_FreeGadget(Gadget)

Declare.i CG_LoadFont(FontName.s = "Arial", FontSize.l = 12, FontStyle.l = #CG_Font_Normal)
Declare.i CG_SetDefaultFont(FontName.s = "Arial", FontSize.l = 12, FontStyle.l = #CG_Font_Normal)
Declare.i CG_SetDefaultColorSet(Index)

Declare.i CG_CustomGadget_MemoryHandle(Gadget.l)
Ainsi l'utilisation des gadgets est bien plus transparente et aisée. Tu fais juste un include dans ton code principal, et tu appelles tout les gadgets qui t’intéresse de la même façon que les gadgets natifs PB

En espérant que ça te soit utile.

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 20:00
par poshu
graph100: je suis parti sur la même voix en fait: l'auteur du gadget remplie un certain nombre de pointeurs avec des fonctions internes, et puis on utilise des fonctions communes (calqués sur celles de pb) pour limiter la redondance et que les gadgets customs soient "plus simple" à utiliser. Je vais jeter à coup d'œil à ton code, merci.

Re: Proposition d'uniformisation des gadgets customs

Publié : lun. 21/janv./2013 23:04
par graph100
Je te conseille de regarder le fichier "CG_INCLUDE_NomGadget_code_squelette_pour_démarrer_le_codage_dun_nouveau_gadget.pb"
de l'archive que j'ai posté.

C'est, comme son nom l'indique un code 'vide' qui peut être remplis rapidement avec le contenu d'un custom gadget.

(je vais de ce pas vérifier si l'archive contient bien mes dernières modifications)

[EDIT] : Bon, je n'ai pas mis à jour le topic, ni l'archive...

Du coup j'ai fait une nouvelle archive que tu peux examiner. Par rapport à l'ancienne, j'ai séparé tous les codes, pour plus de lisibilité, et un fichier include bcp plus petit (360ko --> 90ko + chaque include), plus rapide à charger dans l'éditeur.

voici le lien : Custom Gadget, derniers changements