TextWindow:
- add buttons - make editable svn path=/trunk/; revision=17773
This commit is contained in:
parent
84fb70ef42
commit
2e93b8b751
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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}
|
||||
};
|
||||
|
||||
|
|
|
@ -70,6 +70,8 @@ static const funnel_ops_t funnel_ops = {
|
|||
text_window_get_text,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
/*...,*/
|
||||
NULL,
|
||||
funnel_logger,
|
||||
|
|
Loading…
Reference in New Issue