pvjc26/du1/gui.c
2026-04-09 22:07:30 +02:00

128 lines
4.5 KiB
C

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Widgets we need to access globally
static GtkWidget *entry_x;
static GtkWidget *text_coeffs;
static GtkWidget *label_result;
static void calculate(GtkWidget *widget, gpointer data) {
(void)widget; (void)data;
// Read x
const char *x_str = gtk_entry_get_text(GTK_ENTRY(entry_x));
double x;
if (sscanf(x_str, "%lf", &x) != 1) {
gtk_label_set_text(GTK_LABEL(label_result), "Chyba: Nepodarilo sa nacitat zaklad x");
return;
}
// Read coefficients from text view
GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_coeffs));
GtkTextIter start, end;
gtk_text_buffer_get_start_iter(buf, &start);
gtk_text_buffer_get_end_iter(buf, &end);
char *text = gtk_text_buffer_get_text(buf, &start, &end, FALSE);
double coeffs[256];
int n = 0;
char *line = strtok(text, "\n");
while (line != NULL && n < 256) {
// skip empty lines
if (strlen(line) == 0 || line[0] == '\r') {
line = strtok(NULL, "\n");
continue;
}
if (sscanf(line, "%lf", &coeffs[n]) != 1) {
char msg[128];
snprintf(msg, sizeof(msg), "Chyba: Nepodarilo sa nacitat polynom na %d mieste.", n + 1);
gtk_label_set_text(GTK_LABEL(label_result), msg);
g_free(text);
return;
}
n++;
line = strtok(NULL, "\n");
}
g_free(text);
if (n == 0) {
gtk_label_set_text(GTK_LABEL(label_result), "Chyba: Nepodarilo sa nacitat polynom na 2 mieste.");
return;
}
// Horner's method
double result = 0.0;
for (int i = 0; i < n; i++) {
result = result * x + coeffs[i];
}
char msg[128];
snprintf(msg, sizeof(msg), "Vysledok je: %.2f", result);
gtk_label_set_text(GTK_LABEL(label_result), msg);
}
static void activate(GtkApplication *app, gpointer user_data) {
(void)user_data;
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Polynóm kalkulačka");
gtk_window_set_default_size(GTK_WINDOW(window), 350, 450);
gtk_container_set_border_width(GTK_CONTAINER(window), 16);
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_add(GTK_CONTAINER(window), box);
// X input
GtkWidget *lbl_x = gtk_label_new("Hodnota x:");
gtk_widget_set_halign(lbl_x, GTK_ALIGN_START);
gtk_box_pack_start(GTK_BOX(box), lbl_x, FALSE, FALSE, 0);
entry_x = gtk_entry_new();
gtk_entry_set_placeholder_text(GTK_ENTRY(entry_x), "napr. 4 alebo 2.5");
gtk_box_pack_start(GTK_BOX(box), entry_x, FALSE, FALSE, 0);
// Coefficients input
GtkWidget *lbl_c = gtk_label_new("Koeficienty (každý na novom riadku, od najvyššieho rádu):");
gtk_widget_set_halign(lbl_c, GTK_ALIGN_START);
gtk_label_set_line_wrap(GTK_LABEL(lbl_c), TRUE);
gtk_box_pack_start(GTK_BOX(box), lbl_c, FALSE, FALSE, 0);
GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll), 150);
gtk_box_pack_start(GTK_BOX(box), scroll, TRUE, TRUE, 0);
text_coeffs = gtk_text_view_new();
gtk_text_view_set_monospace(GTK_TEXT_VIEW(text_coeffs), TRUE);
gtk_container_add(GTK_CONTAINER(scroll), text_coeffs);
// Calculate button
GtkWidget *btn = gtk_button_new_with_label("Vypočítať");
g_signal_connect(btn, "clicked", G_CALLBACK(calculate), NULL);
gtk_box_pack_start(GTK_BOX(box), btn, FALSE, FALSE, 0);
// Result label
label_result = gtk_label_new("Vysledok sa zobrazí tu.");
gtk_widget_set_halign(label_result, GTK_ALIGN_START);
gtk_label_set_selectable(GTK_LABEL(label_result), TRUE);
// Style the result label
GtkStyleContext *ctx = gtk_widget_get_style_context(label_result);
GtkCssProvider *provider = gtk_css_provider_new();
gtk_css_provider_load_from_data(provider, "label { font-size: 16px; font-weight: bold; }", -1, NULL);
gtk_style_context_add_provider(ctx, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_box_pack_start(GTK_BOX(box), label_result, FALSE, FALSE, 0);
gtk_widget_show_all(window);
}
int main(int argc, char **argv) {
GtkApplication *app = gtk_application_new("sk.tuke.pvjc.polynom", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
int status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}