TextWindow:

- add buttons
  - make editable




svn path=/trunk/; revision=17773
This commit is contained in:
Luis Ontanon 2006-03-30 19:42:49 +00:00
parent 84fb70ef42
commit 2e93b8b751
4 changed files with 168 additions and 12 deletions

View File

@ -43,6 +43,14 @@ typedef void (*text_win_close_cb_t)(void*);
typedef void (*funnel_dlg_cb_t)(gchar** user_input, void* data);
typedef gboolean (*funnel_bt_cb_t)(funnel_text_window_t* tw, void* data);
typedef struct _funnel_bt_t {
funnel_text_window_t* tw;
funnel_bt_cb_t func;
void* data;
} funnel_bt_t;
typedef struct _funnel_ops_t {
funnel_text_window_t* (*new_text_window)(const gchar* label);
void (*set_text)(funnel_text_window_t* win, const gchar* text);
@ -51,7 +59,9 @@ typedef struct _funnel_ops_t {
void (*clear_text)(funnel_text_window_t* win);
const gchar* (*get_text)(funnel_text_window_t* win);
void (*set_close_cb)(funnel_text_window_t* win, text_win_close_cb_t cb, void* data);
void (*set_editable)(funnel_text_window_t* win, gboolean editable);
void (*destroy_text_window)(funnel_text_window_t* win);
void (*add_button)(funnel_text_window_t* win, funnel_bt_t* cb, const gchar* label);
#if 0
funnel_node_t* (*new_tree_window)(const gchar* title, gchar** columns);
funnel_node_t* (*add_node)(funnel_node_t* node, gchar** values);

View File

@ -67,6 +67,8 @@
struct _funnel_text_window_t {
GtkWidget* win;
GtkWidget* txt;
GtkWidget* hbox;
GtkWidget* button_hbox;
GtkWidget* bt_close;
text_win_close_cb_t close_cb;
void* close_data;
@ -103,6 +105,7 @@ static void unref_text_win_cancel_bt_cb(GtkWidget *bt _U_, gpointer data) {
g_free(tw);
}
static gboolean text_window_unref_del_event_cb(GtkWidget *win _U_, GdkEvent *event _U_, gpointer user_data) {
funnel_text_window_t* tw = user_data;
@ -132,7 +135,7 @@ static gboolean text_window_delete_event_cb(GtkWidget *win _U_, GdkEvent *event
static funnel_text_window_t* new_text_window(const gchar* title) {
funnel_text_window_t* tw = g_malloc(sizeof(funnel_text_window_t));
GtkWidget *txt_scrollw, *main_vb, *bbox;
GtkWidget *txt_scrollw, *main_vb;
tw->close_cb = NULL;
tw->close_data = NULL;
@ -168,16 +171,29 @@ static funnel_text_window_t* new_text_window(const gchar* title) {
gtk_text_view_set_left_margin(GTK_TEXT_VIEW(tw->txt), 4);
gtk_text_view_set_right_margin(GTK_TEXT_VIEW(tw->txt), 4);
#endif
bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
tw->bt_close = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
SIGNAL_CONNECT(tw->bt_close, "clicked", text_window_cancel_button_cb, tw);
tw->hbox = gtk_hbox_new(FALSE, 0);
gtk_widget_show(tw->hbox);
tw->button_hbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(tw->button_hbox), GTK_BUTTONBOX_START);
gtk_box_pack_start(GTK_BOX(tw->hbox), tw->button_hbox, TRUE, TRUE, 0);
gtk_widget_show(tw->button_hbox);
gtk_box_pack_start(GTK_BOX(main_vb), tw->hbox, FALSE, FALSE, 0);
tw->bt_close = gtk_button_new_with_label("Close");
GTK_WIDGET_SET_FLAGS(tw->bt_close, GTK_CAN_DEFAULT);
OBJECT_SET_DATA(tw->hbox, "Close", tw->bt_close);
gtk_box_pack_end(GTK_BOX(tw->hbox), tw->bt_close, FALSE, FALSE, 0);
gtk_widget_show(tw->bt_close);
SIGNAL_CONNECT(tw->bt_close, "clicked", text_window_cancel_button_cb, tw);
gtk_widget_grab_default(tw->bt_close);
gtk_container_add(GTK_CONTAINER(txt_scrollw), tw->txt);
gtk_container_add(GTK_CONTAINER(txt_scrollw), tw->txt);
#if GTK_MAJOR_VERSION >= 2
gtk_window_resize(GTK_WINDOW(tw->win),400,300);
#else
@ -322,6 +338,8 @@ static const gchar* text_window_get_text(funnel_text_window_t* tw) {
#endif
}
static void text_window_set_close_cb(funnel_text_window_t* tw, text_win_close_cb_t cb, void* data) {
tw->close_cb = cb;
tw->close_data = data;
@ -344,6 +362,42 @@ static void text_window_destroy(funnel_text_window_t* tw) {
}
}
static void text_window_set_editable(funnel_text_window_t* tw, gboolean editable){
#if GTK_MAJOR_VERSION < 2
gtk_text_set_editable(GTK_TEXT(tw->txt), editable);
#else
gtk_text_view_set_editable(GTK_TEXT_VIEW(tw->txt), editable);
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->txt), editable);
#endif
}
static gboolean text_window_button_cb(GtkWidget *bt _U_, gpointer user_data)
{
funnel_bt_t* cbd = user_data;
if (cbd->func) {
return cbd->func(cbd->tw,cbd->data);
} else {
return TRUE;
}
}
static void text_window_add_button(funnel_text_window_t* tw, funnel_bt_t* cbd, const gchar* label) {
GtkWidget *button;
cbd->tw = tw;
button = gtk_button_new_with_label(label);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
OBJECT_SET_DATA(tw->hbox, label, button);
gtk_box_pack_start(GTK_BOX(tw->button_hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
SIGNAL_CONNECT(button, "clicked", text_window_button_cb, cbd);
}
struct _funnel_dlg_data {
GtkWidget* win;
@ -469,7 +523,9 @@ static const funnel_ops_t funnel_ops = {
text_window_clear,
text_window_get_text,
text_window_set_close_cb,
text_window_set_editable,
text_window_destroy,
text_window_add_button,
/*...,*/
funnel_new_dialog,
funnel_logger,

View File

@ -263,7 +263,7 @@ static void text_win_close_cb(void* data) {
}
}
ELUA_METHOD TextWindow_at_close(lua_State* L) { /* Set the function that will be called when the window closes */
ELUA_METHOD TextWindow_set_atclose(lua_State* L) { /* Set the function that will be called when the window closes */
#define ELUA_ARG_TextWindow_at_close_ACTION 2 /* A function to be executed when the user closes the window */
TextWindow tw = checkTextWindow(L,1);
@ -366,7 +366,7 @@ ELUA_METHOD TextWindow_get_text(lua_State* L) { /* Get the text of the window */
ELUA_RETURN(1); /* The TextWindow's text. */
}
static int TextWindow_gc(lua_State* L) {
static int TextWindow__gc(lua_State* L) {
TextWindow tw = checkTextWindow(L,1);
if (!tw)
@ -376,6 +376,91 @@ static int TextWindow_gc(lua_State* L) {
return 1;
}
ELUA_METHOD TextWindow_set_editable(lua_State* L) { /* Set the function that will be called when the window closes */
#define ELUA_OPTARG_TextWindow_at_close_EDITABLE 2 /* A boolean flag, defaults to true */
TextWindow tw = checkTextWindow(L,1);
gboolean editable = luaL_optint(L,2,1);
if (!tw)
ELUA_ERROR(TextWindow_at_close,"cannot be called for something not a TextWindow");
if (ops->set_editable)
ops->set_editable(tw,editable);
pushTextWindow(L,tw);
ELUA_RETURN(1); /* The TextWindow object. */
}
typedef struct _elua_bt_cb_t {
lua_State* L;
int func_ref;
int data_ref;
} elua_bt_cb_t;
static gboolean elua_button_callback(funnel_text_window_t* tw, void* data) {
elua_bt_cb_t* cbd = data;
lua_State* L = cbd->L;
lua_settop(L,0);
lua_pushcfunction(L,dlg_cb_error_handler);
lua_rawgeti(L, LUA_REGISTRYINDEX, cbd->func_ref);
pushTextWindow(L,tw);
lua_rawgeti(L, LUA_REGISTRYINDEX, cbd->data_ref);
switch ( lua_pcall(L,2,0,1) ) {
case 0:
break;
case LUA_ERRRUN:
g_warning("Runtime error while calling button callback");
break;
case LUA_ERRMEM:
g_warning("Memory alloc error while calling button callback");
break;
default:
g_assert_not_reached();
break;
}
return TRUE;
}
ELUA_METHOD TextWindow_add_button(lua_State* L) {
#define ELUA_ARG_TextWindow_add_button_LABEL 2 /* The label of the button */
#define ELUA_ARG_TextWindow_add_button_FUNCTION 3 /* The function to be called when clicked */
#define ELUA_ARG_TextWindow_add_button_DATA 4 /* The data to be passed to the function (other than the window) */
TextWindow tw = checkTextWindow(L,1);
const gchar* label = luaL_checkstring(L,ELUA_ARG_TextWindow_add_button_LABEL);
funnel_bt_t* fbt;
elua_bt_cb_t* cbd;
if (!tw)
ELUA_ERROR(TextWindow_at_close,"cannot be called for something not a TextWindow");
if (! lua_isfunction(L,ELUA_ARG_TextWindow_add_button_FUNCTION) )
ELUA_ARG_ERROR(TextWindow_add_button,FUNCTION,"must be a function");
lua_settop(L,4);
if (ops->add_button) {
fbt = ep_alloc(sizeof(funnel_bt_t));
cbd = ep_alloc(sizeof(elua_bt_cb_t));
fbt->tw = tw;
fbt->func = elua_button_callback;
fbt->data = cbd;
cbd->L = L;
cbd->data_ref = luaL_ref(L, LUA_REGISTRYINDEX);
cbd->func_ref = luaL_ref(L, LUA_REGISTRYINDEX);
ops->add_button(tw,fbt,label);
}
pushTextWindow(L,tw);
ELUA_RETURN(1); /* The TextWindow object. */
}
ELUA_METHODS TextWindow_methods[] = {
ELUA_CLASS_FNREG(TextWindow,new),
@ -384,13 +469,16 @@ ELUA_METHODS TextWindow_methods[] = {
ELUA_CLASS_FNREG(TextWindow,append),
ELUA_CLASS_FNREG(TextWindow,prepend),
ELUA_CLASS_FNREG(TextWindow,clear),
ELUA_CLASS_FNREG(TextWindow,at_close),
ELUA_CLASS_FNREG(TextWindow,set_atclose),
ELUA_CLASS_FNREG(TextWindow,set_editable),
ELUA_CLASS_FNREG(TextWindow,get_text),
ELUA_CLASS_FNREG(TextWindow,add_button),
{0, 0}
};
ELUA_META TextWindow_meta[] = {
{"__tostring", TextWindow_get_text},
{"__gc", TextWindow_gc},
{"__gc", TextWindow__gc},
{0, 0}
};

View File

@ -70,6 +70,8 @@ static const funnel_ops_t funnel_ops = {
text_window_get_text,
NULL,
NULL,
NULL,
NULL,
/*...,*/
NULL,
funnel_logger,