1

カスタム gtk ソース ガター レンダラー pixbuf を挿入し、特定の行にアイコンをレンダリングしたいと考えています。

参照 API は、インターフェイスが GtkTreeView のインターフェイスと非常に似ていると述べていますが、ツリー モデルでは機能しません。では、GtkSourceGutter がツリー モデルで機能しない場合、特定の行にデータをレンダリングするにはどうすればよいでしょうか?

ライブラリ全体のすべての関数、提案されたすべての api と子オブジェクトをチェックしましたが、それについてのヒントすらありません。

意味がありません。man ページには、GtkSourceGutterRendererPixbuf を使用してセル内にアイコンを表示すると書かれています。実行すると、ガター gtk_source_gutter_renderer_pixbuf_set_pixbuf(renderer, pixbuf);内のすべてのセルのアイコンがレンダリングされます。そして、唯一の方法が cairo を使用して pixbuf を手動で描画することである場合、これらのレンダラーのポイントは何ですか?

gtksourcegutterrenderer を使用して特定の行でpixbuf をレンダリングするにはどうすればよいですか?


ここに画像の説明を入力

4

2 に答える 2

1

個人的には、カスタム オブジェクトを作成するのは簡単だという主張に単純に同意することはできません。誰にとっても簡単ではありません。

主に、この質問にはタグが付けられcており、オブジェクト指向プログラミングを知らない人はその概念に慣れていない可能性があるためです。

読んで実践することです。

たとえば、独自のウィジェットを作成する方法がわからない場合でも、慌てる必要はありません。

私が考えることができる最も簡単な解決策は、独自のレンダラーを作成することではなく、レンダラーにレンダリング データのクエリ方法を指示することです。

GtkSourceGutterRenderer のquery-dataシグナルを、次のようなシグナル ハンドラーに接続するだけです。

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);
}

:

  1. GtkSourceMark は GtkSourceGutterRenderer インターフェイスを共有しているため、特定の行に適用されるソース マークのカテゴリを指定して、他のソース マークをフィルター処理することができます。そうしないと、カスタム レンダラー pixbuf も他のソース マークの左にレンダリングされます。

  2. 内部でレンダリングする正確な pixbuf を指定する必要があります。これを行うと、電話する必要がなくなりますgtk_source_gutter_renderer_pixbuf_set_pixbuf()。API にリソース処理を任せます。

于 2018-05-26T18:45:34.123 に答える