Il semblerait que oui effectivement (d'après le miroir GitHub de Gtk). Cependant les listBox ont leur propre implémentation sous Gtk3 au lieu de réutiliser Gtktreeview sous Gtk2, ce qui doit résoudre le problème du centrage je pense.
Version imprimable
Il semblerait que oui effectivement (d'après le miroir GitHub de Gtk). Cependant les listBox ont leur propre implémentation sous Gtk3 au lieu de réutiliser Gtktreeview sous Gtk2, ce qui doit résoudre le problème du centrage je pense.
Salut,
je reviens 3 secondes là-dessus, un mois plus tard, car, oui, j'ai bien constaté le défaut du centrage dans ListBox, ComboBox, et c'est assez moche (et horripilant :mrgreen:)...
Alors plutôt que de supprimer ta proc et décommenter l'original, j'ai fait comme ça :
Plus qu'à trouver une combine pour passer un paramètre permettant à la proc de s'adapter à la cible...Code:
1
2
3 CellRenderer := GTK_CELL_RENDERER(Pointer(Instance)); // CellRenderer^.xalign := 0.5; // centré mais très moche pour listbox-combobox CellRenderer^.xalign := 0; // ok, aligné à gauche
hello,
voici une solution au texte non centré dans une listview avec gtk2 :
L'astuce consiste à créer une procédure d'appel différente suivant que l'on a une combobox, listbox ou une listview :
cela se passe d'abord dans gtk2wscustomlistview.inc
Ensuite il faut modifier le fichier gtk2cellrenderer.pas où se trouve la gestion du renderer pour y ajouter des procédures :Code:
1
2
3 // add renderers pixrenderer := gtk_cell_renderer_pixbuf_new(); textrenderer := LCLIntfCellRenderer_New_Center; // au lieu de LCLIntfCellRenderer_New
Code:
1
2
3 function LCLIntfCellRenderer_GetType_Center: TGtkType; function LCLIntfCellRenderer_New_Center: PGtkCellRenderer;
et voilà le résultat sous LUbuntu 16.04 gtk2 Lazarus 1.8 :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 procedure LCLIntfCellRenderer_ClassInit(aClass: Pointer); cdecl; //aClass: PLCLIntfCellRendererClass var LCLClass: PLCLIntfCellRendererClass; RendererClass: PGtkCellRendererClass; begin LCLClass := PLCLIntfCellRendererClass(aClass); DebugLn(['LCLIntfCellRenderer_ClassInit']); RendererClass := GTK_CELL_RENDERER_CLASS(aClass); LCLClass^.DefaultGtkGetSize := RendererClass^.get_size; LCLClass^.DefaultGtkRender := RendererClass^.render; RendererClass^.get_size := @LCLIntfCellRenderer_GetSize; RendererClass^.render := @LCLIntfCellRenderer_Render; end; procedure LCLIntfCellRenderer_ClassInitCenter(aClass: Pointer); cdecl; //aClass: PLCLIntfCellRendererClass var LCLClass: PLCLIntfCellRendererClass; RendererClass: PGtkCellRendererClass; begin LCLClass := PLCLIntfCellRendererClass(aClass); DebugLn(['LCLIntfCellRenderer_ClassInitCenter']); RendererClass := GTK_CELL_RENDERER_CLASS(aClass); LCLClass^.DefaultGtkGetSize := RendererClass^.get_size; LCLClass^.DefaultGtkRender := RendererClass^.render; RendererClass^.get_size := @LCLIntfCellRenderer_GetSize; RendererClass^.render := @LCLIntfCellRenderer_Render; end; procedure LCLIntfCellRendererCenter_Init({%H-}Instance:PGTypeInstance; {%H-}theClass: Pointer); cdecl; // Instance: PLCLIntfCellRenderer; // theClass: PLCLIntfCellRendererClass var CellRenderer: PGtkCellRenderer; begin CellRenderer := GTK_CELL_RENDERER(Pointer(Instance)); CellRenderer^.xalign := 0.5; DebugLn(['LCLIntfCellRendererCenter_Init']); end; procedure LCLIntfCellRenderer_Init({%H-}Instance:PGTypeInstance; {%H-}theClass: Pointer); cdecl; // Instance: PLCLIntfCellRenderer; // theClass: PLCLIntfCellRendererClass var CellRenderer: PGtkCellRenderer; begin CellRenderer := GTK_CELL_RENDERER(Pointer(Instance)); CellRenderer^.xalign := 0; DebugLn(['LCLIntfCellRenderer_Init']); end; function LCLIntfCellRenderer_GetType: TGtkType; const CR_NAME = 'LCLIntfCellRenderer'; crType: TGtkType = 0; crInfo: TGTKTypeInfo = ( type_name: CR_NAME; object_size: SizeOf(TLCLIntfCellRenderer)+100; // a TLCLIntfCellRenderer class_size: SizeOf(TLCLIntfCellRendererClass)+100; class_init_func: @LCLIntfCellRenderer_ClassInit; object_init_func : @LCLIntfCellRenderer_Init; reserved_1: nil; reserved_2: nil; base_class_init_func: nil; ); var IID: TGUID; S: AnsiString; begin if (crType = 0) then begin // patch by tk: in case of shared library we must create unique name if CreateGUID(IID) = 0 then S := Format('LCL%d%d%d', [Word(IID.time_low), Word(IID.time_low shr 16), IID.time_mid]); crType := gtk_type_from_name(PAnsiChar(S)); if crType = 0 then begin crInfo.type_name:=PAnsiChar(S); crType := gtk_type_unique(gtk_cell_renderer_text_get_type, @crInfo); end; end; Result := crType; end; function LCLIntfCellRenderer_GetType_Center: TGtkType; const CR_NAME = 'LCLIntfCellRenderer'; crType: TGtkType = 0; crInfo: TGTKTypeInfo = ( type_name: CR_NAME; object_size: SizeOf(TLCLIntfCellRenderer)+100; // a TLCLIntfCellRenderer class_size: SizeOf(TLCLIntfCellRendererClass)+100; class_init_func: @LCLIntfCellRenderer_ClassInitCenter; object_init_func : @LCLIntfCellRendererCenter_Init; reserved_1: nil; reserved_2: nil; base_class_init_func: nil; ); var IID: TGUID; S: AnsiString; begin if (crType = 0) then begin // patch by tk: in case of shared library we must create unique name if CreateGUID(IID) = 0 then S := Format('LCL%d%d%d', [Word(IID.time_low), Word(IID.time_low shr 16), IID.time_mid]); crType := gtk_type_from_name(PAnsiChar(S)); if crType = 0 then begin crInfo.type_name:=PAnsiChar(S); crType := gtk_type_unique(gtk_cell_renderer_text_get_type, @crInfo); end; end; Result := crType; end; function LCLIntfCellRenderer_New_Center: PGtkCellRenderer; begin DebugLn(['LCLIntfCellRenderer_New_Center']); Result := g_object_new(LCLIntfCellRenderer_GetType_Center, nil,[]); end; function LCLIntfCellRenderer_New: PGtkCellRenderer; begin DebugLn(['LCLIntfCellRenderer_New']); Result := g_object_new(LCLIntfCellRenderer_GetType, nil,[]); end;
Pièce jointe 357048
EDIT : en pièce jointe les fichiers modifiés à mettre dans lcl/interfaces/gtk2 . Testés avec Lazarus 1.8.2 gtk2 sous Lubuntu 16.04
Ami calmant, J.P (santé)
Tout vient à point à qui sait attendre, dit le proverbe.
Et moi je rajoute : respect ! :bravo::applo::hola:
Ça, c'est d'la soluce, bien joué, amigo ! :ccool:
Pas le temps de tester aujourd'hui, mais dans la semaine je pense...
Grand :merci: par avance
Ça me démangeait... :mouarf:
Et donc :
Pièce jointe 357617
Perfecto dans ma vieille 1.4, dès que j'ai 5 minutes (mettons 1 heure ;)) je m'attaque à la 1.8, mais ça n'est pas pressé, j'ai autre chose sur le gaz.
Je ne sais pas comment te dire :merci: plus fort que comme ça :king:
:yaisse2:
Je vais pouvoir réanimer mon vieux projet, encore bravo à toi :ccool:
Et je coche :resolu: ! Elle est pas belle la vie ? :applo:
Bonsoir,
je n'avais pas vu que tu avais posté un zip avec les deux fichiers, j'ai donc fait à l'ancienne, au bloc-notes entre les fichiers d'origine et tes corrections indiquées dans le post.
Ce soir je ne sais pas ce qui m'a pris, mais j'ai voulu comparer mon fichier modifié et celui que tu fournis dans le zip (je parle de gtk2cellrenderer.pas, pas eu le temps de comparer l'autre), et je note une différence dans la fonction LCLIntfCellRenderer_GetType_Center: TGtkType; :
Extrait du code posté :
Extrait du zip :Code:
1
2
3 class_size: SizeOf(TLCLIntfCellRendererClass)+100; class_init_func: @LCLIntfCellRenderer_ClassInitCenter; object_init_func : @LCLIntfCellRendererCenter_Init;
Et la dernière ligne montre clairement que tu as modifié le nom de la fonction concernée : c'est bien, ça uniformise les noms, mais ça trouble pendant la comparaison, :mouarf:Code:
1
2
3 class_size: SizeOf(TLCLIntfCellRendererClass)+100; class_init_func: @LCLIntfCellRenderer_ClassInit; // <<<<<< manque "Center" ! object_init_func : @LCLIntfCellRenderer_Init_Center;
EDIT :
1, je barre :
J'attends de tes nouvelles pour savoir dans quelle direction je vais car si la modification du nom de la fonction d'init de l'objet n'est pas perturbante, l'appel de la mauvaise fonction pour l'init de la class me déstabilise !
2, je précise :
j'ai écrit "manque Center" car il y a une proc appelée LCLIntfCellRenderer_ClassInitCenter dans le code posté mais en fait, il n'y en a pas besoin (d'où son absence dans le zip), donc ma remarque est inutile.
(Pas facile à voir avec le bloc-note, ce genre de différences...)
Tout va bien : il suffit de remplacer les fichiers (après renommage de ceux qui vont devenir les "anciens au cas où") et hop !
:ccool: