c - GtkSourceGutter - Sådan gengiver ikon eller tekst på en bestemt linje

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har indsat custom gtk source gutter renderer pixbuf og jeg vil give ikon på en bestemt linje.


Referencegrundlaget angiver, at grænsefladen ligner meget på GtkTreeView, men arbejder ikke med en træmodel.
Så ... hvordan skal jeg give data til en bestemt linje, hvis GtkSourceGutter ikke arbejder med en træmodel?


Jeg kontrollerede hver funktion i hele biblioteket, alle foreslåede api og børneobjekter og intet selv om det.


Det giver ikke mening. Mandsiden siger, at GtkSourceGutterRendererPixbuf bruges til at vise ikonet IN A CELL.
Gør gtk\_source\_gutter\_renderer\_pixbuf\_set\_pixbuf(renderer, pixbuf); vil gøre ikonet for alle celler i renden.
Og hvis den eneste måde er at tegne pixbuf manuelt ved hjælp af Kairo. Hvad er punktet i disse renderere?


Hvordan laver jeg pixbuf i en bestemt linje ved hjælp af gtksourcegutterrenderer?





Indtast billedbeskrivelse her [15]

Bedste reference


Jeg kan personligt ikke bare være enig med påstanden om at skabe tilpassede objekter er let. Det er ikke let, ikke for alle.


Hovedsageligt fordi dette spørgsmål er mærket c, og folk, der ikke kender objektorienteret programmering, måske ikke er fortrolige med sine begreber.


Det handler om at læse og øve.


Så tag ikke panik, hvis du ikke ved hvordan du f.eks. Opretter din egen widget.


Den nemmeste løsning, jeg kan tænke på, involverer ikke at oprette din egen renderer, men fortælle gentageren, hvordan man forespørger om gengivelse af data.


Du skal blot forbinde forespørgselsdata-signalet på din GtkSourceGutterRenderer til en signalhåndterer, der ser sådan ud: [16]


G\_MODULE\_EXPORT void gutter\_renderer\_query\_data (GtkSourceGutterRenderer *renderer, GtkTextIter *start, GtkTextIter *end, GtkSourceGutterRendererState state)
{
    GtkSourceView*      view    = NULL;
    GtkSourceBuffer*    buffer  = NULL;
    GSList*             marks   = NULL;
    GdkPixbuf*          pixbuf  = NULL;

    view    = GTK\_SOURCE\_VIEW(gtk\_source\_gutter\_renderer\_get\_view(renderer));
    buffer  = GTK\_SOURCE\_BUFFER(gtk\_text\_view\_get\_buffer(GTK\_TEXT\_VIEW(view)));

    marks   = gtk\_source\_buffer\_get\_source\_marks\_at\_iter(buffer, start, NULL);

    if(marks != NULL)
    {
        char *category = gtk\_source\_mark\_get\_category(marks->data);

        if(!g\_strcmp0(category, "CERTAIN\_CATEGORY")) /* See note 1) */
            pixbuf = gtk\_image\_get\_pixbuf(gtk\_image\_new\_from\_file("icon\_file\_here")); /* See note 2) */

        g\_slist\_free(marks);
    }

    g\_object\_set(G\_OBJECT(renderer), "pixbuf", pixbuf, "yalign", 0.5, NULL);
}





Noter :



  1. GtkSourceMark deler GtkSourceGutterRenderer-grænsefladen, så du måske vil filtrere dine andre kildemærker ved at angive kategorien for et kildemærke, der anvendes til den bestemte linje. Ellers vil din brugerdefinerede renderer pixbuf også blive overført til dine andre kildemærker.

  2. Du skal angive den nøjagtige pixbuf, du vil gøre internt. Hvis du gør det, behøver du ikke at ringe gtk\_source\_gutter\_renderer\_pixbuf\_set\_pixbuf(). Du lader API'en gøre ressourcehåndtering.


Andre referencer 1


Jeg har ikke arbejdet med GtkSourceView, men jeg kan give dig nogle spor.





Sådan gøres det af GtkSourceView s forfatter



Først og fremmest har vi brug for nogle links:



  • GtkSourceGutterRendererMarks kildekode

  • GtkSourceGutterRendererPixbuf kildekode

  • GtkSourceGutterRenderer dokumentation



Lad os starte med GtkSourceGutterRendererPixbuf. Fra den s class\_init metode finder vi ud af, at det kun tilsidesætter draw metode. Det eneste formål er at gøre en pixbuf eller ikon. Ren tegning. [17] [18] [19]


GtkSourceGutterRenderer-dokumentationen siger dog, at der er et query-data signal, som kan bruges til at tune Renderer's interne tilstand. På dette tidspunkt bør vi se på GtkSourceGutterRendererMarks, som er arvet fra RendererPixbuf. Det overstyrer ikke [[draw, men tilsidesætter query\_data. (Af en eller anden grund GtkSourceGutterRendererClass er ikke beskrevet i dokumentationen. Jeg ved ikke hvorfor.)


/* Read my comments. */
static void
gutter\_renderer\_query\_data (GtkSourceGutterRenderer      *renderer,
                            GtkTextIter                  *start,
                            GtkTextIter                  *end,
                            GtkSourceGutterRendererState  state)
{
  GSList *marks;
  GdkPixbuf *pixbuf = NULL;

  view = GTK\_SOURCE\_VIEW (gtk\_source\_gutter\_renderer\_get\_view (renderer));
  buffer = GTK\_SOURCE\_BUFFER (gtk\_text\_view\_get\_buffer (GTK\_TEXT\_VIEW (view)));

  marks = gtk\_source\_buffer\_get\_source\_marks\_at\_iter (buffer,
                                                      start,
                                                      NULL);

  /* If there are marks, we find a pixbuf for one of them. 
   * Otherwise pixbuf is NULL. */
  if (marks != NULL)
  {
    size = measure\_line\_height (view);
    pixbuf = composite\_marks (view, marks, size);

    g\_slist\_free (marks);
  }

  /* Now tell parent class to render certain pixbuf
   * It will render nothing if pixbuf is NULL. */
  g\_object\_set (G\_OBJECT (renderer),
                   "pixbuf", pixbuf,
                   NULL);
}





Mine anbefalinger.



Du ønsker at tegne mærker på bestemte linjer (f.eks. Vil markere nuværende debugger linje). Hvis jeg var dig, ville jeg have arvet fra RendererPixbuf, overriden query\_data og bruge gtk\_text\_iter\_get\_lineGtkTextIter *start. Det ser ud som det er det minimale minimum.


Du er velkommen til at stille yderligere spørgsmål.