【问题标题】:GtkSourceView/ GtkSourceBuffer - How to mark a line in red and show an iconGtkSourceView/ GtkSourceBuffer - 如何用红色标记一行并显示一个图标
【发布时间】:2017-02-22 22:00:54
【问题描述】:

我想将 GtkSourceView 中的一些文本标记为红色并显示一个图标。这是我目前的尝试,似乎什么也没做:

void plainTextEditor_textView_addLineMarker(int lineNumber, linemarker* marker, context_base* context)
{
    GtkWidget* plainTextEditor_textView = get_plainTextEditor_textView_from_notebook(context->notebook);
    GtkTextIter iter;
    GtkTextBuffer * buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(plainTextEditor_textView) );
    gtk_text_buffer_get_iter_at_line( buffer, &iter, lineNumber );
    printf("extendedEditor_linebox_markError %i\n", lineNumber);
    gtk_source_buffer_create_source_mark( GTK_SOURCE_BUFFER(buffer), marker->message, "dialog-error", &iter );
}

printf 打印正确的行号。

如果我调用该方法两次,gtk 会打印一些 gtk-critical:“Mark myMark 已存在于缓冲区中”。

但是 gtksourceview 上根本没有可见的变化。

也许我应该对gtk_source_mark_attributes 做点什么来更改特定类别的属性?但是如何?我找不到任何关于如何使用它的好信息。

【问题讨论】:

    标签: c gtk3 gtksourceview


    【解决方案1】:

    好的,我自己想通了。这是一个将背景标记为红色并显示一个小的错误对话框项目的版本。如果鼠标悬停在项目上,则会显示错误消息。

    //data which is needed in different methods
    typedef struct
    {
        GtkSourceMarkAttributes* plainTextEditor_lineMarkers_warningAttributes;
        GtkSourceMarkAttributes* plainTextEditor_lineMarkers_errorAttributes;
        ...
    } context_base;
    
    // things to do only once
    int main(int argc, char *argv[])
    {
        ...
        GtkWidget * plainTextEditor_textView = gtk_source_view_new();
        gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW(plainTextEditor_textView),TRUE);
        gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW(plainTextEditor_textView),TRUE);
        gtk_source_view_set_show_line_marks (GTK_SOURCE_VIEW(plainTextEditor_textView), TRUE);
    
        context->plainTextEditor_lineMarkers_errorAttributes = gtk_source_mark_attributes_new();
        gtk_source_mark_attributes_set_background(context->plainTextEditor_lineMarkers_errorAttributes, &error_color);
        gtk_source_mark_attributes_set_icon_name(context->plainTextEditor_lineMarkers_errorAttributes,"dialog-error");
        gtk_source_view_set_mark_attributes( GTK_SOURCE_VIEW(plainTextEditor_textView), sourceMarkCategory_error, context->plainTextEditor_lineMarkers_errorAttributes, 10);
        ...
    }
    
    // callback to display message when hovering on the linemarker
    gchar* on_lineMarkerTooltip_displayed(GtkSourceMarkAttributes *attributes, GtkSourceMark *mark, linemarker* marker)
    {
        if( marker->message == NULL)
            return NULL;
        return strdup(marker->message);
    }
    
    // method to create new linemark
    void plainTextEditor_textView_addLineMarker(int lineNumber, linemarker* marker, context_base* context)
    {
        if( context->plainTextEditor_lineMarkers[lineNumber-1]->message != NULL ) // there is a message on this line
        {
            if( strcmp(context->plainTextEditor_lineMarkers[lineNumber-1]->message, marker->message ) == 0 ) // its the same message, nothing to do
            {
                return;
            }
        }
        GtkWidget* plainTextEditor_textView = get_plainTextEditor_textView_from_notebook(context->notebook);
        GtkTextIter iter;
        GtkTextBuffer * buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(plainTextEditor_textView) );
        gtk_text_buffer_get_iter_at_line( buffer, &iter, lineNumber );
    
        context->plainTextEditor_lineMarkers[lineNumber-1]->message = strdup(marker->message);
    
        char sourceMarkName[sourceMarkNameMaxDigits];
        snprintf(sourceMarkName, sourceMarkNameMaxDigits, "%i", lineNumber);
        gtk_source_view_set_mark_attributes (GTK_SOURCE_VIEW(plainTextEditor_textView),sourceMarkCategory_error,context->plainTextEditor_lineMarkers_errorAttributes,10);
        gtk_source_buffer_create_source_mark( GTK_SOURCE_BUFFER(buffer), sourceMarkName, sourceMarkCategory_error, &iter );
        g_signal_connect(G_OBJECT(context->plainTextEditor_lineMarkers_errorAttributes), "query-tooltip-text", G_CALLBACK(on_lineMarkerTooltip_displayed), context->plainTextEditor_lineMarkers[lineNumber-1]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多