Hi, errol and thanks for the nice code.
The only thing I would change when the user clicks on the 3rd radio button: the maximal value allowed for entry2 is 1 because nothing is faster than the speed of light.
Oh and the other thing, I put the widgets in table (2x7) like the code below so the radio buttons are parallel (hbox-like, but didn't work as I tried so I tried table.)
But how to allow only entering "1" as maximal value ? any defined functions?
Also: My internal trying of solving the bug was this code from yesterday but this doesn't solve the problem completely because I wasn't done with the coding and your code is much better now.
Code:
//compile: gcc -Wall -g ./ref1c.c -o ref1c `pkg-config --cflags gtk+-2.0 --libs gtk+-2.0` && ./ref1c
#include <gtk/gtk.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
const float minute = 60.0;
const float hour = 60.0;
const float day = 24.0;
const float week = 7.0;
const float month = 30.0;
const float year = 365.0;
long double distance=946080000.0*10000.0;
long double speed=300000.0;
long double x_distance;
long double x_time;
char totalready[80];
short int last_selected_radio_button=0;
typedef struct
{
GtkWidget *window;
GtkWidget *instruct;
GtkWidget *instruct2;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *entry2;
GtkWidget *table;
GtkWidget *radio_button_1;
GtkWidget *radio_button_2;
GtkWidget *radio_button_3;
GtkWidget *radio_button_4;
} GtkObj;
gboolean delete (GtkWidget *widget, GdkEvent *event, gpointer data)
{
return FALSE;
}
static void destroy (GtkObject *object, gpointer data)
{
gtk_main_quit();
}
static void clicked_callback_radio_button(GdkEventKey *event, GtkObj *object)
{
gchar * x_label_str = NULL;
const gchar * label_str;
if ( (int) g_utf8_strlen(gtk_entry_get_text(GTK_ENTRY(object->entry)), -1) != 0 )
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(object->radio_button_2)))
{
distance = 1;
label_str = gtk_entry_get_text(GTK_ENTRY(object->entry));
long double number1 = strtod(label_str, NULL);
x_distance = number1 * distance/speed/minute/hour/day/year;
sprintf(totalready, "%16Lf", x_distance);
x_label_str = g_strconcat("Travel time in years: ", totalready, NULL);
gtk_label_set_text(GTK_LABEL(object->label), x_label_str);
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(object->radio_button_1)))
{
distance = distance*946080000.0*10000.0;
label_str = gtk_entry_get_text(GTK_ENTRY(object->entry));
long double number1 = strtod(label_str, NULL);
x_distance = number1 * distance;
sprintf(totalready, "%16Lf", x_distance/speed/minute/hour/day/year);
x_label_str = g_strconcat("Travel time in years: ", totalready, NULL);
gtk_label_set_text(GTK_LABEL(object->label), x_label_str);
}
}
}
static void clicked_callback_radio_button2(GdkEventKey *event, GtkObj *object)
{
gchar * x_label_str = NULL;
const gchar * label_str;
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(object->radio_button_3)))
{
gtk_entry_set_text(GTK_ENTRY(object->entry2), "");
gtk_widget_set_sensitive(object->entry2, FALSE);
label_str = gtk_entry_get_text(GTK_ENTRY(object->entry));
long double number1 = strtod(label_str, NULL);
x_distance = number1 * distance;
speed=300000.0;
sprintf(totalready, "%16Lf", x_distance/speed/minute/hour/day/year);
x_label_str = g_strconcat("Travel time in years: ", totalready, NULL);
gtk_label_set_text(GTK_LABEL(object->label), x_label_str);
last_selected_radio_button=3;
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(object->radio_button_4)))
{
gtk_widget_set_sensitive(object->entry2,TRUE);
gtk_label_set_text(GTK_LABEL(object->label), "");
last_selected_radio_button=4;
}
}
static void clicked_callback_entry (GtkWidget *entry, GdkEventKey *event, GtkObj *object)
{
gchar * x_label_str = NULL;
const gchar * label_str;
if ( (int) g_utf8_strlen(gtk_entry_get_text(GTK_ENTRY(object->entry)), -1) != 0 && last_selected_radio_button!=4)
{
label_str = gtk_entry_get_text(GTK_ENTRY(object->entry));
long double number1 = strtod(label_str, NULL);
x_distance = number1 * distance;
sprintf(totalready, "%16Lf", x_distance/speed/minute/hour/day/year);
x_label_str = g_strconcat("Travel time in years: ", totalready, NULL);
gtk_label_set_text(GTK_LABEL(object->label), x_label_str);
}
else
gtk_label_set_text(GTK_LABEL(object->label), NULL);
}
static void clicked_callback_entry2 (GtkWidget *entry, GdkEventKey *event, GtkObj *object)
{
gchar * x_label_str = NULL;
const gchar * label_str;
label_str = gtk_entry_get_text(GTK_ENTRY(object->entry2));
long double speed__entry2 = strtod(label_str, NULL);
speed__entry2 = speed__entry2/(minute*hour);
sprintf(totalready, "%16Lf", x_distance/speed__entry2/minute/hour/day/year);
x_label_str = g_strconcat("Travel time in years: ", totalready, NULL);
gtk_label_set_text(GTK_LABEL(object->label), x_label_str);
g_free(x_label_str);
}
int main(int argc, char *argv[])
{
GtkObj *obj = g_new(GtkObj, 1);
gtk_init (&argc, &argv);
obj->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(obj->window), 400, 100);
gtk_container_set_border_width(GTK_CONTAINER(obj->window),10);
gtk_window_set_urgency_hint(GTK_WINDOW(obj->window), TRUE);
gtk_window_set_title(GTK_WINDOW(obj->window),"Space Travel");
gtk_widget_show(obj->window);
g_signal_connect(G_OBJECT(obj->window), "delete_event", G_CALLBACK(delete), NULL);
g_signal_connect(G_OBJECT(obj->window), "destroy", G_CALLBACK(destroy), NULL);
obj->table = gtk_table_new (7, 2, TRUE);
gtk_container_add(GTK_CONTAINER(obj->window), obj->table);
obj->instruct = gtk_label_new ("Enter your distance:");
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->instruct, 0, 2, 0, 1);
obj->radio_button_1 = gtk_radio_button_new_with_label(NULL, "in light-years");
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->radio_button_1, 0, 1, 1, 2);
obj->radio_button_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(obj->radio_button_1), "in km");
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->radio_button_2, 1, 2, 1, 2);
obj->entry = gtk_entry_new();
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->entry, 0, 2, 2, 3);
gtk_widget_grab_focus(obj->entry);
obj->instruct2 = gtk_label_new ("Enter your speed:");
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->instruct2, 0, 2, 3, 4);
obj->radio_button_3 = gtk_radio_button_new_with_label(NULL, "in speed-of-light");
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->radio_button_3, 0, 1, 4, 5);
obj->radio_button_4 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(obj->radio_button_3), "in km/h");
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->radio_button_4, 1, 2, 4, 5);
obj->entry2 = gtk_entry_new();
gtk_widget_set_sensitive(obj->entry2, FALSE);
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->entry2, 0, 2, 5, 6);
gtk_widget_grab_focus(obj->entry2);
obj->label = gtk_label_new (NULL);
gtk_table_attach_defaults (GTK_TABLE (obj->table), obj->label, 0, 2, 6, 7);
g_signal_connect(G_OBJECT(obj->entry), "key-release-event", G_CALLBACK(clicked_callback_entry), (gpointer) obj);
g_signal_connect(G_OBJECT(obj->radio_button_2), "clicked", G_CALLBACK(clicked_callback_radio_button), (gpointer) obj);
g_signal_connect(G_OBJECT(obj->radio_button_3), "clicked", G_CALLBACK(clicked_callback_radio_button2), (gpointer) obj);
g_signal_connect(G_OBJECT(obj->entry2), "key-release-event", G_CALLBACK(clicked_callback_entry2), (gpointer) obj);
gtk_widget_show_all(GTK_WIDGET(obj->window));
gtk_main ();
return 0;
}