Proposition d'uniformisation des gadgets customs
Proposition d'uniformisation des gadgets customs
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.
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
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.
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
Une bonne idée poshu.
J'ai un Invalid Access Memory dans le speedgadget.pbi Ligne 114 (PB 5.00)
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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Proposition d'uniformisation des gadgets customs
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Proposition d'uniformisation des gadgets customs
à la ligne 114?
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 :/
Code : Tout sélectionner
Procedure _SpeedBarGetAttribute(Gadget, Attribute)
Je suis sous ubuntu 12.04 en 5.10b4 et je n'ai aucun IMA :/
Re: Proposition d'uniformisation des gadgets customs
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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: Proposition d'uniformisation des gadgets customs
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 :
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 :
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.
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
;-
;}####################################################
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)
En espérant que ça te soit utile.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel )
Mon site : CeriseCode (Attention Chantier perpétuel )
Re: Proposition d'uniformisation des gadgets customs
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
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
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 )
Mon site : CeriseCode (Attention Chantier perpétuel )