Есть ли способ, которым я могу создать «рамку» вокруг строки в gtk? - PullRequest
0 голосов
/ 05 декабря 2011

Мой первый опыт работы с GUI восходит к 1996 году с Xaw` и Xlib.После 2004 года я сдался и вернулся в CLI.Теперь мне нужно создать небольшой графический виджет «виджет [?]», Который начинается с «0» внизу и выше, имеет две кнопки «inc» и «dec».Над этим вверху находится строка

Имя файла _ ___

кнопки inc / dec увеличивают / уменьшают имя файла.

Например, если пользователь печатает в режиме разговора, в нижней части «0» станет

speak.0.text.кнопки включения / уменьшения изменят нижнюю строку вверх или вниз, НЕ ниже 0.

Я застрял прямо сейчас, пытаясь выделить "0" или ".0.text. Я пытался, ноимя_файла.N.text в кнопку gtk. gcc либо ядро, либо отказывается компилировать.

Кто-нибудь может предложить способ поставить границу вокруг «0» или иным образом выделить ее?

Большое спасибо.

1 Ответ

2 голосов
/ 05 декабря 2011

Я не уверен, что эффект типа границы доступен сразу, но есть другие изменения, связанные со шрифтами, которые вы можете сделать, используя Pango Markup, чтобы выделить ваш текст, используя gtk_label_set_markup. Также вы можете сделать кнопку уменьшения как нечувствительную, используя gtk_widget_set_sensitive, когда счетчик достигает 0, чтобы его нельзя было уменьшить дальше. Вот пример кода для вашей справки:

/*
 * Compilation : gcc `pkg-config --cflags --libs gtk+-2.0` -Wall -Wextra -Werror label-sample.c -o label-sample
 */

#include <gtk/gtk.h>
#include <string.h>

static int counter = 0;
static GtkWidget *label;
static char *suffix = ".txt";
static char *prefix;


static void
update_label(void)
{
    char buffer[1024];
    memset(&buffer, 0, sizeof buffer);

    /*If counter is < 1, use markup to highlight text*/
    if(counter < 1)
    {
        if(prefix)
            g_snprintf(buffer, 1023, "<span foreground=\"red\" background=\"yellow\" size=\"x-large\">%s%d%s</span>",prefix, counter, suffix);
        else
            g_snprintf(buffer, 1023, "<span foreground=\"red\" background=\"yellow\" size=\"x-large\">%d%s</span>", counter, suffix);
        gtk_label_set_markup(GTK_LABEL(label), buffer);
    }
    else
    {
        if(prefix)
            g_snprintf(buffer, 1023, "%s%d%s", prefix, counter, suffix);
        else
            g_snprintf(buffer, 1023, "%d%s", counter, suffix);
        gtk_label_set_label(GTK_LABEL(label), buffer);
    }
}

static void
inc_button_click_cb(GtkButton *button, gpointer data)
{
    (void)button;
    GtkWidget *dec_button = data;
    counter++;
    /* Change senstivity of the decrement button based on counter*/
    if(counter > 0 && !gtk_widget_is_sensitive(dec_button))
        gtk_widget_set_sensitive(dec_button, TRUE);
    /* Update label to show updated counter */
    update_label();
    return;
}

static void
dec_button_click_cb(GtkButton *button, gpointer data)
{
    (void)data;
    counter--;
    /* Change senstivity of the decrement button based on counter*/
    if(counter < 1 && gtk_widget_is_sensitive(GTK_WIDGET(button)))
        gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE);
    /* Update label to show updated counter */
    update_label();
    return;
}


static void
entry_changed_cb(GtkEditable *editable, gpointer data)
{
    (void)data;
    /* Caller has to free the text, so call g_free */
    g_free(prefix);
    /* Get the complete text */
    prefix=gtk_editable_get_chars(editable,0, -1);
    /* Update label to show updated prefix */
    update_label();
    return;
}

int main(void)
{
    GtkWidget *button_inc;
    GtkWidget *button_dec;
    GtkWidget *entry_label;
    GtkWidget *entry;
    GtkWidget *window;
    GtkWidget *vbox;

    gtk_init(NULL, NULL);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    vbox = gtk_vbox_new(FALSE, 5);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    label = gtk_label_new("");
    update_label();

    button_dec = gtk_button_new_with_label("Decrease counter");
    g_signal_connect(button_dec, "clicked", G_CALLBACK(dec_button_click_cb), NULL);
    gtk_widget_set_sensitive(button_dec, FALSE);

    button_inc = gtk_button_new_with_label("Increase counter");
    g_signal_connect(button_inc, "clicked", G_CALLBACK(inc_button_click_cb), button_dec);

    entry_label = gtk_label_new("Entry prefix to be displayed in the entry below:");

    entry = gtk_entry_new();
    g_signal_connect(entry,"changed", G_CALLBACK(entry_changed_cb), NULL);

    gtk_box_pack_start(GTK_BOX(vbox), label, 0, 0, 0);
    gtk_box_pack_start(GTK_BOX(vbox), button_inc, 0, 0, 0);
    gtk_box_pack_start(GTK_BOX(vbox), button_dec, 0, 0, 0);
    gtk_box_pack_start(GTK_BOX(vbox), entry_label, 0, 0, 0);
    gtk_box_pack_start(GTK_BOX(vbox), entry, 0, 0, 0);

    gtk_widget_show_all(window);

    gtk_main();

    g_free(prefix);

    return 0;
}

Надеюсь, это поможет!

...