From ea4f27e916500aead7dd116ff3e76ce3e727441d Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Jan 31 2019 12:08:07 +0000 Subject: c gtk3: calc --- diff --git a/c/gtk3/calc/calc.c b/c/gtk3/calc/calc.c new file mode 100644 index 0000000..b202ed2 --- /dev/null +++ b/c/gtk3/calc/calc.c @@ -0,0 +1,127 @@ +#include +#include + + +GtkWidget *entry_a; +GtkWidget *entry_b; +GtkWidget *entry_c; +GtkWidget *history; + +char c_str[1024]; +char history_str[1024]; + + +void add_history(const char *str) { + GtkTextIter iter; + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(history)); + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_insert(buffer, &iter, str, -1); + gtk_text_buffer_insert(buffer, &iter, "\n", -1); +} + +void clicked_add(GtkButton *button, gpointer data) { + double a = atof(gtk_entry_get_text(GTK_ENTRY(entry_a))); + double b = atof(gtk_entry_get_text(GTK_ENTRY(entry_b))); + double c = a + b; + sprintf(c_str, "%g", c); + sprintf(history_str, "%g + %g = %g", a, b, c); + gtk_entry_set_text(GTK_ENTRY(entry_c), c_str); + add_history(history_str); +} + +void clicked_sub(GtkButton *button, gpointer data) { + double a = atof(gtk_entry_get_text(GTK_ENTRY(entry_a))); + double b = atof(gtk_entry_get_text(GTK_ENTRY(entry_b))); + double c = a - b; + sprintf(c_str, "%g", c); + sprintf(history_str, "%g - %g = %g", a, b, c); + gtk_entry_set_text(GTK_ENTRY(entry_c), c_str); + add_history(history_str); +} + +void clicked_mul(GtkButton *button, gpointer data) { + double a = atof(gtk_entry_get_text(GTK_ENTRY(entry_a))); + double b = atof(gtk_entry_get_text(GTK_ENTRY(entry_b))); + double c = a * b; + sprintf(c_str, "%g", c); + sprintf(history_str, "%g * %g = %g", a, b, c); + gtk_entry_set_text(GTK_ENTRY(entry_c), c_str); + add_history(history_str); +} + +void clicked_div(GtkButton *button, gpointer data) { + double a = atof(gtk_entry_get_text(GTK_ENTRY(entry_a))); + double b = atof(gtk_entry_get_text(GTK_ENTRY(entry_b))); + double c = a / b; + sprintf(c_str, "%g", c); + sprintf(history_str, "%g / %g = %g", a, b, c); + gtk_entry_set_text(GTK_ENTRY(entry_c), c_str); + add_history(history_str); +} + +void activate(GtkApplication* app, gpointer data) { + GtkWidget *window = gtk_application_window_new(app); + gtk_window_set_default_size(GTK_WINDOW(window), 600, 400); + gtk_container_set_border_width(GTK_CONTAINER(window), 10); + + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + gtk_container_add(GTK_CONTAINER(window), hbox); + + GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + gtk_container_add(GTK_CONTAINER(hbox), vbox); + + entry_a = gtk_entry_new(); + gtk_container_add(GTK_CONTAINER(vbox), entry_a); + + GtkWidget *buttons_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + gtk_box_set_homogeneous(GTK_BOX(buttons_box), TRUE); + gtk_container_add(GTK_CONTAINER(vbox), buttons_box); + + GtkWidget *button_add = gtk_button_new_with_label("+"); + g_signal_connect(button_add, "clicked", G_CALLBACK(clicked_add), NULL); + gtk_container_add(GTK_CONTAINER(buttons_box), button_add); + + GtkWidget *button_sub = gtk_button_new_with_label("-"); + g_signal_connect(button_sub, "clicked", G_CALLBACK(clicked_sub), NULL); + gtk_container_add(GTK_CONTAINER(buttons_box), button_sub); + + GtkWidget *button_mul = gtk_button_new_with_label("*"); + g_signal_connect(button_mul, "clicked", G_CALLBACK(clicked_mul), NULL); + gtk_container_add(GTK_CONTAINER(buttons_box), button_mul); + + GtkWidget *button_div = gtk_button_new_with_label("/"); + g_signal_connect(button_div, "clicked", G_CALLBACK(clicked_div), NULL); + gtk_container_add(GTK_CONTAINER(buttons_box), button_div); + + entry_b = gtk_entry_new(); + gtk_container_add(GTK_CONTAINER(vbox), entry_b); + + GtkWidget *separator = gtk_separator_new(GTK_ORIENTATION_VERTICAL); + gtk_container_add(GTK_CONTAINER(vbox), separator); + + entry_c = gtk_entry_new(); + gtk_container_add(GTK_CONTAINER(vbox), entry_c); + + GtkWidget *frame = gtk_frame_new(NULL); + gtk_box_pack_end(GTK_BOX(hbox), frame, TRUE, TRUE, 0); + + GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_container_add(GTK_CONTAINER(frame), scroll); + + history = gtk_text_view_new(); + gtk_text_view_set_left_margin(GTK_TEXT_VIEW(history), 5); + gtk_text_view_set_right_margin(GTK_TEXT_VIEW(history), 5); + gtk_text_view_set_top_margin(GTK_TEXT_VIEW(history), 5); + gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(history), 5); + gtk_container_add(GTK_CONTAINER(scroll), history); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *application = gtk_application_new(NULL, 0); + g_signal_connect(application, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(application), argc, argv); + g_object_unref(application); + return status; +}