TextEditorGadget(), et environnement CustomGadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: TextEditorGadget(), et environnement CustomGadget

Message par GeBonet »

@graph100 : Pas de quoi ! :lol:
Je suis encore étudiant, et en plein milieu d'un semestre assez lourd avec plein de boulot, dans une année importante pour la suite (je veux partir à l'étranger --> canada ;) ).
Ben, Beau projet :lol:
Et surtout concentre toi sur tes études... Les deux, "scolaires" et "travaux".
Gerhard
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

Correction importante : Il y avait une erreur dans les procédures qui faisait qu'elles s'appelaient elle-même lorsuqu'on désactivait un gadget -_-
d’où une erreur de pile d'appel.

C'est corrigé et stable.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: TextEditorGadget(), et environnement CustomGadget

Message par Ar-S »

Merci pour la MAJ
~~~~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
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: TextEditorGadget(), et environnement CustomGadget

Message par GallyHC »

Y a interrer que tu gere bien les choses lollllllllllllllll Vai t'en rajouter des gadget :) franchemet merci pour la maj , j'ai po encore teste mais je vais le faire un plus vite.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: TextEditorGadget(), et environnement CustomGadget

Message par dayvid »

Va-y mon gros nounours GallyHC :mrgreen:
Fait nous des gadgets :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

@Ar-S :mrgreen: thanks (dis moi, une question. tu utilises le projet CG pour une de tes applis ?)

@GallyHc : Hey !! c'est pour toi que j'ai tout remodelé ^^. Attend un peu, je vais faire un modèle de gadget vide pour plus de facilité.

Pour tout les autres : si vous utilisez une partie du projet pour une appli complète, je serais très intéressé que vous me le dites ^^ pour avoir d'autres exemple que mes prog et puis ca me fait plaisir ^^
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

Voila. Le code qui suit permet d'avoir une idée de la structure du code d'un nouveau gadget.

Il y a des choses à ne pas modifier et à garder bien sur. Mais c'est basiquement ce que j'ai fait lors du codage de chaque nouveau gadget jusqu'à présent...

Code : Tout sélectionner



;- ###########
;####################################################
;-  Include de NomGadget - Author
;{###################################################
;- ###########

; TO USE THIS SAMPLE CODE : replace ALL : "NomGadget" by the Name of your gadget. This name must not be used by another existing gadget (of course -_- )

	;{ NOTE à lire (READ ME)
	
	; il est nécessaire de définir au moins les 2 constantes suivante pour intégré le gadget dans l'environnement CG :
	
	; #CG_ADDGADGETCODE_NomGadget ; sert à compiler la partie de code uniquement si le gadget est présent dans l'appli cible
	; 														; chercher le tag suivant pour ajouter le code :
	;															; [TAG CONSTANT ADDGADGETCODE]
	
	; #CG_GadgetType_NomGadget 		; sert à donner le type de gadget
	; 														; chercher le tag suivant pour ajouter le code :
	;															;	[TAG CONSTANT GADGETTYPE]
	
	
	; It is necessary to define at least the following 2 constants in order to integrate the gadget in the CG environnement :
	
	; #CG_ADDGADGETCODE_NomGadget ; used to select the source code of the gadget, if the gadget is used in the taget programme
	; 														; search the following Tag the add the constant
	;															; [TAG CONSTANT ADDGADGETCODE]
	
	; #CG_GadgetType_NomGadget 		; used the give the gadget type
	; 														; search the following Tag the add the constant
	;															;	[TAG CONSTANT GADGETTYPE]
	
	;}

CompilerIf #CG_ADDGADGETCODE_NomGadget
	
	
;{ NomGadget


;{ structure

Structure ICG_NomGadget Extends ICG_CustomGadget_base
	; champs de structure suplémentaire contenant les données nécessaire au fonctionnement du gadget
	; supplementary Structure field holding the data needed to use correctly the gadget
	
EndStructure

;}


;{ constantes

; Ces constantes peuvent être des Flags (option) passés en paramètre lors de la création du gadget
; ou bien des attributs, etc...

; This constant may be use as flag, in the parameter field at the gadget creation
; or may be attribut, etc...


;}


;}



;{ Public procedures


Procedure CG_NomGadgetGadget(Gadget, x, y, Width, Height, ParentWindow, Anchor.b = #CG_Anchor_None, Dock.b = #CG_Dock_None, IfInGadget_ParentGadget = -1)
	Protected I.l, res, *obj.ICG_NomGadget
	
	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 existait déjà, on libère les ressources
		If FindMapElement(ICG_Var_Global\Gadget(), Str(Gadget))
			CG_FreeGadget(Gadget)
		EndIf
		
		
		res = CanvasGadget(Gadget, x, y, Width, Height, #PB_Canvas_Keyboard)
		
		If res = 0 ; echec de la création du canvasgadget()
			ProcedureReturn 0
		EndIf
		
		; on gère le #pb_any
		If Gadget = #PB_Any : Gadget = res : EndIf
		
		; création de l'objet NomGadget
		*obj = AllocateMemory(SizeOf(ICG_NomGadget))
		; si echec d'allocation mémoire
		If *obj = 0 : ProcedureReturn 0 : EndIf
		
		
		; initialisation de la mémoire du nouvel objet
		InitializeStructure(*obj, ICG_NomGadget)
		
		; on ajoute l'interface
		*obj\_Function = *obj
		*obj\zz_FunctionTable = ?VTable_NomGadget
		
		
		
		With *obj
			\Gadget = Gadget
			\GadgetType = #CG_GadgetType_NomGadget
			
			\ParentWindow = ParentWindow
			\ParentGadget = IfInGadget_ParentGadget
			
			\x = x
			\y = y
			\Width = Width
			\Height = Height
			
			; 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
			
			; Initialisation des champs de structure personnalisés
			
			
		EndWith
		
		; dessin du gadget pour la 1ere fois
		*obj\_Function\RenderGadget()
		
		
		; 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 res
	EndIf
	
	ProcedureReturn 0
EndProcedure

;}


;{ Internal procedures
;-

Procedure ICG_NomGadget_ProcessEvent(*obj.ICG_NomGadget, event_type)
	; A vous de jouer pour traiter les evenements !
	
	
EndProcedure


Procedure ICG_NomGadget_Render(*obj.ICG_NomGadget)
	; A vous de programmer le dessin du gadget
	; essayez de faire une procédure la plus rapide possible, car elle va être appelé pour chaque redimentionnement
	
	
EndProcedure


;}


;{ Internal common procedure

;{ NOTE

; Ces procedures doivent exister. Elle font partie de l'interface commune à tout les gadgets.
; Si le gadget ne les nécessite pas, alors il y a juste rien dedans.

; les paramètres de chacune des ces fonctions ne peuvent pas être modifiés (on ne peux pas en ajouter ou en enlever)
; car ils sont nécessaire à l'interface


; These procedure must exist. They are part of the interface of all the gadgets.
; If the gadget don't need to use one of them, just leave the default code !

; The parameters are not changeable ! because of the interface !

;}

Procedure ICG_NomGadget_ResizeGadget(*obj.ICG_NomGadget, x, y, width, height)
	*obj\x = x
	*obj\y = y
	*obj\Width = width
	*obj\Height = height
	
	ResizeGadget(*obj\Gadget, x, y, width, height)
	
	*obj\_Function\RenderGadget()
EndProcedure


Procedure ICG_NomGadget_SetGadgetState(*obj.ICG_NomGadget, State)
	*obj\State = State
	
	
	
EndProcedure


Procedure.i ICG_NomGadget_GetGadgetAttribute(*obj.ICG_NomGadget, Attribute)
	ProcedureReturn GetGadgetAttribute(*obj\Gadget, Attribute)
EndProcedure

Procedure ICG_NomGadget_SetGadgetAttribute(*obj.ICG_NomGadget, Attribute, Value.i)
	; à vous de remplir, moi j'y ai mis un code par défaut
	
	SetGadgetAttribute(*obj\Gadget, Attribute, Value)
EndProcedure


Procedure ICG_NomGadget_DisableGadget(*obj.ICG_NomGadget, State)
	*obj\_Function\RenderGadget()
EndProcedure


Procedure ICG_NomGadget_SetGadgetText(*obj.ICG_NomGadget, Text.s)
	
EndProcedure

Procedure.s ICG_NomGadget_GetGadgetText(*obj.ICG_NomGadget)
	ProcedureReturn *obj\Text
EndProcedure


Procedure ICG_NomGadget_AddGadgetItem(*obj.ICG_NomGadget, Position, Text.s, FrontColor.l, Image.l, Redraw.b)
	
EndProcedure

Procedure ICG_NomGadget_ClearGadgetItem(*obj.ICG_NomGadget)
	
EndProcedure


Procedure ICG_NomGadget_FreeGadget(*obj.ICG_NomGadget)
	; libération du canvasgadget
	FreeGadget(*obj\Gadget)
	
	; libération des images :
	; TRES IMPORTANT : ne pas oublier de libérer les images !
	
EndProcedure


;}



DataSection
	VTable_NomGadget:
	Data.i	@ICG_NomGadget_ProcessEvent(), @ICG_NomGadget_Render()
	Data.i	@ICG_NomGadget_ResizeGadget(), @ICG_NomGadget_SetGadgetState(), @ICG_NomGadget_GetGadgetAttribute(), @ICG_NomGadget_SetGadgetAttribute()
	Data.i	@ICG_NomGadget_DisableGadget(), @ICG_NomGadget_SetGadgetText(), @ICG_NomGadget_GetGadgetText(), @ICG_NomGadget_AddGadgetItem(), @ICG_NomGadget_ClearGadgetItem()
	Data.i	@ICG_NomGadget_FreeGadget()
EndDataSection



CompilerEndIf

;-
;}####################################################



_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

Nouvelle petite maj : 2.00.1815

Elle n'est pas finie entièrement, mais pour coller avec le post d'au-dessus, fallais que je la calle maintenant.



CustomGadget :

- Modification de la Macro d'appel de CG_ProcessEvent()
- Ajout de la possibilité de retourné des CG_event_type avec les Procedure de traitement des evenements des gadgets.

- Ajout d'un exemple de code permettant de ne pas démarrer de rien pour un nouveau gadget


CanvasButton :

- Ajout du retour de la valeur #True en eventtype lors d'un clic sur le bouton


ImageEx :

- Suppression de CG_ImageEx_SetFlag() au profit de CG_SetGadgetAttribute(), le paramètre value n'est pas utilisé



Bugs Résolus :

- CG_TextEditorGadget() : Mauvais placement du texte dans l'éditeurGadget lorsqu'aucun texte n'y est préalablement placé avec CG_TextEditor_AddText()


Bugs détectés :

- CG_TextEditorGadget() : Problème de curseur lorsque du texte est sélectionné (avec les scrollbar)
- Lors de l'utilisation d'un CG_containergadget, le redimentionnement auto des gadgets non situés dans des CG_ContainerGadget() ou des CG_SplitterGadget() n'est pas effectué
Dernière modification par graph100 le ven. 16/mars/2012 23:24, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: TextEditorGadget(), et environnement CustomGadget

Message par dayvid »

Moi je serais interesser par un bouton comme dans multimedia fusion
un bouton ou on peut notament choisir la couleur des bordure du bouton !
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

Petite Maj pour correction de bugs : 2.00.1830

CustomGadget :

- Elimination des multiples Procedures de gestion des scrollbar au profit d'une seule communune pour tout les gadgets


Bugs Résolus :

- Lors de l'utilisation d'un CG_containergadget, le redimentionnement auto des gadgets non situés dans des CG_ContainerGadget() ou des CG_SplitterGadget() n'est pas effectué [BUG majeur]
- ImageSlide : Crash lors de redimensionnement avec hauteur nulle
- ImageSlide : Bug de liste chainée lorsque le gadget ne contient pas d'élément


Bugs détectés :

- CG_TextEditorGadget() : Problème de curseur lorsque du texte est sélectionné (avec les scrollbar) [BUG mineur]
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: TextEditorGadget(), et environnement CustomGadget

Message par Ar-S »

tu utilises le projet CG pour une de tes appli ?
Non pas encore, j'ai pas encore testé toutes les possibilités. Pour le moment mes tentatives 2D/Canvas sont en suspens car j'ai du mettre à jour d'autres petites appli bureautiques jusqu'ici et ces appli ne nécessite pas de commandes additionnelles à PB.
~~~~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
MetalOS
Messages : 1498
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: TextEditorGadget(), et environnement CustomGadget

Message par MetalOS »

Salut Graph100, je test ton code sous Mac OS X et j'ai une erreur ligne 216 du fichier "CustomGadget.pbi" ou le compilateur me dit que sur

*zz_FunctionTable.i "Les types natifs ne peuvent pas être utilisées avec des pointeurs."
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

Effectivement si tu utilises les dernières version du compilateur sur va avoir des tonnes de ces erreurs ci. Elles proviennent de la dernière maj de PB

J'ai mis la version que je me suis faite pour PB 5.11 ici : CustomGadgets_5_10.zip

En revanche je n'ai pas mis a jour les exemples, cette archive ne contient que les fichiers include.

Le code suivant est fonctionnel sur Pb5.11 window et linux (normalement), sans oublier de corriger les chemins d'accès aux includes !
Je n'ai pas MacOs, donc je n'ai jamais pu tester. Je serais ravi que ça fonctionne aussi puisque c'étais dans l'idée du projet.

Code : Tout sélectionner

; En premier : on définit quels gadget seront utilisés :
#CG_ADDGADGETCODE_Container = #True
#CG_ADDGADGETCODE_ImageEx = #True
#CG_ADDGADGETCODE_Splitter = #True


; PUIS : on inclus le fichier ressource
#CG_Code_Directory = "./CustomGadgets/"
IncludeFile "./CustomGadgets_5_10/CustomGadget.pbi"



; On peut maintenant utiliser les gadgets :

If OpenWindow(0, 0, 0, 800, 600, "Splitter, Container & ImageEx !!", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
	
	;{ on crée l'image d'exemple
	
	CreateImage(0, 200, 100)
	If StartDrawing(ImageOutput(0))
		For a = 0 To 100
			Circle(Random(ImageWidth(0)), Random(ImageHeight(0)), Random(10), Random(#White))
		Next
		
		StopDrawing()
	EndIf
	;}
	
	CG_ImageExGadget(1, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 0, RGB(0, 0, 255), #CG_ImageEx_Flag_Resize_FitWhenBigger)
	CG_ImageExGadget(2, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 0, RGB(0, 255, 0))
	CG_SplitterGadget(3, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 1, 2, #CG_Splitter_Flag_Normal)
	
	CG_ImageExGadget(4, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 0, RGB(0, 255, 255))
	CG_SplitterGadget(5, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 3, 4, #CG_Splitter_Flag_Horizontal)
	
	CG_ImageExGadget(6, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 0, RGB(255, 0, 0))
	CG_SplitterGadget(7, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 5, 6, #CG_Splitter_Flag_Normal)
	
	CG_ImageExGadget(8, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 0, RGB(255, 0, 255))
	CG_SplitterGadget(9, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, 0, 7, 8, #CG_Splitter_Flag_Horizontal)
	
	CG_ContainerGadget(10, #PB_Ignore, #PB_Ignore, 300, 300, 0)
		CG_ImageExGadget(11, #PB_Ignore, #PB_Ignore, #PB_Ignore, 100, 0, 0, #Black, #CG_ImageEx_Flag_Normal, #CG_Anchor_Top, #CG_Dock_Top, 10)
		CG_ImageExGadget(12, 0, 100, 300, 100, 0, 0, #White, #CG_ImageEx_Flag_Rotate_90 | #CG_ImageEx_Flag_Resize_FitAll | #CG_ImageEx_Flag_Center, #CG_Anchor_All, #CG_Dock_None, 10)
		CG_ImageExGadget(13, #PB_Ignore, #PB_Ignore, #PB_Ignore, 100, 0, 0, #Black, #CG_ImageEx_Flag_Normal, #CG_Anchor_Bottom, #CG_Dock_Bottom, 10)
	CloseGadgetList()
	
	CG_SplitterGadget(14, 50, 50, 700, 500, 0, 9, 10, #CG_Splitter_Flag_Normal, #CG_Anchor_All)
	
	CG_SetGadgetState(9, CG_GetGadgetState(9) + 100)
	
Else
	End
EndIf


Repeat
	event = WaitWindowEvent()
	CG_ProcessEvent(event, EventGadget(), EventType())
	
	
Until event = #PB_Event_CloseWindow

End
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
MetalOS
Messages : 1498
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: TextEditorGadget(), et environnement CustomGadget

Message par MetalOS »

Pourquoi ne pas tous inclure dans un seul est même fichier Pbi ? Je t'est cet après midi sur Mac et je te tiens au courant.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: TextEditorGadget(), et environnement CustomGadget

Message par graph100 »

j'ai tout mis dans un seul pbi au départ, mais le fichier faisait dans les 12k ligne
Je n'aime pas trop ça...
Dernière modification par graph100 le sam. 11/mai/2013 23:13, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre