Gtk+ Validation
This is a couple hour hack to come up with a way to do form validation with gtk+. The idea would be to add support in GtkBuilder to do entire forms within the designer.
However, to do the same thing from code, here is a quick example.
#include <gtk/gtk.h>
#include "gtk-range-validator.h"
#include "gtk-bg-style-modifier.h"
#include "utils.h"
int main (int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *dialog,
*apply,
*spinbutton,
*entry;
GtkValidator *range, *range2;
GtkStyleModifier *bg_modifier;
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_file_or_exit (builder, "test.ui");
gtk_builder_get_objects_ex (builder,
"dialog", &dialog,
"apply", &apply,
"spinbutton", &spinbutton,
"entry", &entry,
NULL);
bg_modifier = gtk_bg_style_modifier_new ();
g_object_set (bg_modifier, "color", "#f84848", NULL);
range = gtk_range_validator_new ();
g_object_set (range,
"widget", spinbutton,
"modifier", bg_modifier,
"prop-name", "value",
"lower", 0.0,
"upper", 10.0,
NULL);
range2 = gtk_range_validator_new ();
g_object_set (range2,
"widget", entry,
"prop-name", "text",
"lower", 0.0,
"upper", 10.0,
"modifier", bg_modifier,
NULL);
g_signal_connect (dialog, "destroy", gtk_main_quit, NULL);
g_signal_connect_swapped (apply, "clicked", G_CALLBACK (gtk_validator_validate), range);
g_signal_connect_swapped (apply, "clicked", G_CALLBACK (gtk_validator_validate), range2);
//g_signal_connect_swapped (apply, "clicked", G_CALLBACK (gtk_widget_hide), dialog);
gtk_widget_show (dialog);
gtk_main ();
return 0;
}
#include "gtk-range-validator.h"
#include "gtk-bg-style-modifier.h"
#include "utils.h"
int main (int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *dialog,
*apply,
*spinbutton,
*entry;
GtkValidator *range, *range2;
GtkStyleModifier *bg_modifier;
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_file_or_exit (builder, "test.ui");
gtk_builder_get_objects_ex (builder,
"dialog", &dialog,
"apply", &apply,
"spinbutton", &spinbutton,
"entry", &entry,
NULL);
bg_modifier = gtk_bg_style_modifier_new ();
g_object_set (bg_modifier, "color", "#f84848", NULL);
range = gtk_range_validator_new ();
g_object_set (range,
"widget", spinbutton,
"modifier", bg_modifier,
"prop-name", "value",
"lower", 0.0,
"upper", 10.0,
NULL);
range2 = gtk_range_validator_new ();
g_object_set (range2,
"widget", entry,
"prop-name", "text",
"lower", 0.0,
"upper", 10.0,
"modifier", bg_modifier,
NULL);
g_signal_connect (dialog, "destroy", gtk_main_quit, NULL);
g_signal_connect_swapped (apply, "clicked", G_CALLBACK (gtk_validator_validate), range);
g_signal_connect_swapped (apply, "clicked", G_CALLBACK (gtk_validator_validate), range2);
//g_signal_connect_swapped (apply, "clicked", G_CALLBACK (gtk_widget_hide), dialog);
gtk_widget_show (dialog);
gtk_main ();
return 0;
}
