Proposition d'uniformisation des gadgets customs

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Proposition d'uniformisation des gadgets customs

Message 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.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Proposition d'uniformisation des gadgets customs

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

Re: Proposition d'uniformisation des gadgets customs

Message par Ar-S »

Une bonne idée poshu.
J'ai un Invalid Access Memory dans le speedgadget.pbi Ligne 114 (PB 5.00)
~~~~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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Proposition d'uniformisation des gadgets customs

Message par falsam »

Même message qu'Ar-s
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%
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Proposition d'uniformisation des gadgets customs

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

Re: Proposition d'uniformisation des gadgets customs

Message par Ar-S »

Je testerai plus avant lors de la release final de PB 5.10
~~~~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
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Proposition d'uniformisation des gadgets customs

Message 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.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Proposition d'uniformisation des gadgets customs

Message 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.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Proposition d'uniformisation des gadgets customs

Message 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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre