2013-01-11 55 views
6

我正在用Haskell的gtk2hs庫編寫一個小的GUI應用程序,目前我正在使用其中的multiline text boxes。我有一個功能,當用戶對文本框中的文本進行更改時,我想運行它,但不希望它們必須單擊按鈕才能激活它。此外,因爲它是一個相當侵入性和處理密集型功能(它繪製圖形,加載文件等),我希望它不會在用戶使任何更改時觸發(這大概可以用bufferChanged文本緩衝區中的信號我猜測?),但是當它們在變化之間停止幾秒時。當用戶停止輸入文字時運行一個函數

基本上我想知道是否有東西在GTK是類似的方式range widgets可以有自己的更新策略設置爲continuous or delayed,但對於文本框

+2

我在wxHaskell中做了一個類似的事情的一個方法是使用設置爲(可配置)1秒延遲的Timer對象,並且每次用戶鍵入時啓用它,這會在鍵入完成後延遲一秒鐘。我放棄了gtk,所以我不熟悉它,但也許你可以使用[Graphics.UI.Gtk.General.General]中的'timeoutAdd'或'timeoutAddFull'和'timeoutRemove'來做類似的事情(http:// hackage.haskell.org/packages/archive/gtk/0.12.3/doc/html/Graphics-UI-Gtk-General-General.html)。 – AndrewC

+0

不知道在Haskell端口中調用了什麼,但這是'g_idle_add()'的用途。 – ptomato

+0

或者(對@ AndrewC的建議),記錄最後一次用戶輸入的時間,並在週期性超時時間內檢查以確定何時運行繁重的代碼。 – ergosys

回答

1

我不知道哈斯克爾綁定,但在任何普通C通過利用超時GSource很容易實現。

#include <gtk/gtk.h> 

static guint source_id = 0; 

static gboolean do_stuff(gpointer user_data) 
{ 
    g_print("doing stuff...\n"); 
    return FALSE; 
} 

static void postpone(void) 
{ 
    if (source_id > 0) 
     g_source_remove(source_id); 
    source_id = g_timeout_add(1000, do_stuff, NULL); 
} 

int main(int argc, char **argv) 
{ 
    GtkWidget *window, *text_view; 
    GtkTextBuffer *text_buffer; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL); 

    text_view = gtk_text_view_new(); 
    gtk_container_add(GTK_CONTAINER(window), text_view); 

    text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)); 
    g_signal_connect(text_buffer, "changed", G_CALLBACK(postpone), NULL); 

    gtk_widget_show_all(window); 
    gtk_main(); 
    return 0; 
} 

雖然超時之前退出TextView的問題仍然處於打開狀態。

相關問題