From 5f830deec8374336d1d268a27e41f5ec492c866c Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 20 Aug 2014 01:08:24 -0400 Subject: [PATCH] Added events and validity methods to TextField and implemented the events on the GTK+ backend. --- redo/basicctrls.go | 9 +++++++++ redo/textfield_unix.go | 28 +++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/redo/basicctrls.go b/redo/basicctrls.go index 8894e7c..cee60f2 100644 --- a/redo/basicctrls.go +++ b/redo/basicctrls.go @@ -48,6 +48,15 @@ type TextField interface { // Text and SetText are Requests that get and set the TextField's text. Text() string SetText(text string) + + // OnChanged is triggered when the text in a TextField is changed somehow. + // Do not bother trying to figure out how the text was changed; instead, perform your validation and use Invalid to inform the user that the entered text is invalid instead. + OnChanged(func()) + + // Invalid throws a non-modal alert (whose nature is system-defined) on or near the TextField that alerts the user that input is invalid. + // The string passed to Invalid will be displayed to the user to inform them of what specifically is wrong with the input. + // Pass an empty string to remove the warning. + Invalid(reason string) } // NewTextField creates a new TextField. diff --git a/redo/textfield_unix.go b/redo/textfield_unix.go index e802947..c4ce8b4 100644 --- a/redo/textfield_unix.go +++ b/redo/textfield_unix.go @@ -9,21 +9,28 @@ import ( ) // #include "gtk_unix.h" -// extern void buttonClicked(GtkButton *, gpointer); -// extern void checkboxToggled(GtkToggleButton *, gpointer); +// extern void textfieldChanged(GtkEditable *, gpointer); import "C" type textfield struct { _widget *C.GtkWidget entry *C.GtkEntry + changed *event } func startNewTextField() *textfield { widget := C.gtk_entry_new() - return &textfield{ + t := &textfield{ _widget: widget, entry: (*C.GtkEntry)(unsafe.Pointer(widget)), + changed: newEvent(), } + g_signal_connect( + C.gpointer(unsafe.Pointer(t._widget)), + "changed", + C.GCallback(C.textfieldChanged), + C.gpointer(unsafe.Pointer(t))) + return t } func newTextField() *textfield { @@ -46,6 +53,21 @@ func (t *textfield) SetText(text string) { C.gtk_entry_set_text(t.entry, ctext) } +func (t *textfield) OnChanged(f func()) { + t.changed.set(f) +} + +func (t *textfield) Invalid(reason string) { + // TODO +} + +//export textfieldChanged +func textfieldChanged(editable *C.GtkEditable, data C.gpointer) { + t := (*textfield)(unsafe.Pointer(data)) +println("changed") + t.changed.fire() +} + func (t *textfield) widget() *C.GtkWidget { return t._widget }