IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Captions non centrées dans ListView en mode Icon [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    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.

  2. #22
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 164
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 164
    Par défaut
    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 )...
    Citation Envoyé par supersnail Voir le message
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure LCLIntfCellRenderer_Init(Instance:PGTypeInstance; Data:Pointer); cdecl;
    var
      CellRenderer: PGtkCellRenderer;
    begin
      CellRenderer := GTK_CELL_RENDERER(Pointer(Instance));
      CellRenderer^.xalign := 0.5;
    end;

    Le seul problème c'est que toutes les ListBox/ComboBox (qui utilisent également le CellRenderer créé par LCLIntfCellRenderer_Init) ont leur texte centré par contre avec cette modification .
    Alors plutôt que de supprimer ta proc et décommenter l'original, j'ai fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Plus qu'à trouver une combine pour passer un paramètre permettant à la proc de s'adapter à la cible...

  3. #23
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 253
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          // add renderers
          pixrenderer := gtk_cell_renderer_pixbuf_new();
          textrenderer := LCLIntfCellRenderer_New_Center; // au lieu de  LCLIntfCellRenderer_New
    Ensuite il faut modifier le fichier gtk2cellrenderer.pas où se trouve la gestion du renderer pour y ajouter des procédures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function LCLIntfCellRenderer_GetType_Center: TGtkType;
    function LCLIntfCellRenderer_New_Center: PGtkCellRenderer;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    et voilà le résultat sous LUbuntu 16.04 gtk2 Lazarus 1.8 :
    Nom : Virtual Disks File Explorer.png
Affichages : 212
Taille : 34,0 Ko

    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é)
    Fichiers attachés Fichiers attachés

  4. #24
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 164
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 164
    Par défaut
    Tout vient à point à qui sait attendre, dit le proverbe.

    Et moi je rajoute : respect !

    Ça, c'est d'la soluce, bien joué, amigo !

    Pas le temps de tester aujourd'hui, mais dans la semaine je pense...

    Grand par avance

  5. #25
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 164
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 164
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pas le temps de tester aujourd'hui, mais dans la semaine je pense...
    Ça me démangeait...

    Et donc :

    Nom : listview_OK.png
Affichages : 190
Taille : 26,7 Ko

    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 plus fort que comme ça


    Je vais pouvoir réanimer mon vieux projet, encore bravo à toi

    Et je coche ! Elle est pas belle la vie ?

  6. #26
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 164
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 164
    Par défaut
    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é :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        class_size: SizeOf(TLCLIntfCellRendererClass)+100;
        class_init_func: @LCLIntfCellRenderer_ClassInitCenter;
        object_init_func : @LCLIntfCellRendererCenter_Init;
    Extrait du zip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        class_size: SizeOf(TLCLIntfCellRendererClass)+100;
        class_init_func: @LCLIntfCellRenderer_ClassInit; // <<<<<< manque "Center" !
        object_init_func : @LCLIntfCellRenderer_Init_Center;
    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,

    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 !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [SP-2010] Mode explorateur non visible dans les bibliothèques
    Par skud07 dans le forum SharePoint
    Réponses: 0
    Dernier message: 28/12/2010, 15h45
  2. comment inserer et faire un menu icone dans listview
    Par r.mehdi dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/05/2008, 01h42
  3. Image non centrée dans un tableau
    Par Kaneda Shotaro dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 05/11/2007, 12h21
  4. sélectionner un item dans un listview en mode détail.
    Par grome dans le forum Windows Forms
    Réponses: 7
    Dernier message: 22/08/2007, 13h16
  5. Image dans listview mode détail
    Par metallica14 dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/07/2007, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo