4 * @author Michal Rysavy
5 * @brief Hlavni logika kalkulacky a volani GTK+
13 /* location of UI XML file relative to path in which program is running */
14 #define BUILDER_XML_FILE "kal.glade"
17 * struktura s ukazateli na jednotlive widgety v aplikaci
45 /** deklarace globalnich promenych pro vysledky kalkulacky
51 * udaj o tom, co se ma delat
52 * 0 - nic, nebylo zadano
62 int desetina
=0; /**< pri hodnote 1 se už tvori desetina cisla */
64 int omezeni
=8; /**< omezeni kolik maximalne muze uzivatel zadat cislic na jedno cislo */
67 * handler, ktery je v glade prirazen stisknuti tlacitka +
69 void on_button0_clicked (GtkObject
*object
, App
*app
)
71 if ((operace
==0)||(operace
==8)){ //zatim je jen jedno cislo
76 else{ //uz bylo vybrano a tak se to pouzije...
77 //zde by mela byt moznost scitani
82 * handler, ktery je v glade prirazen stisknuti tlacitka -
84 void on_button1_clicked (GtkObject
*object
, App
*app
)
86 if ((operace
==0)||(operace
==8)){ //zatim je jen jedno cislo
91 else{ //uz bylo vybrano a tak se to pouzije...
92 //zde by mela byt moznost scitani
97 * handler, ktery je v glade prirazen stisknuti tlacitka *
99 void on_button2_clicked (GtkObject
*object
, App
*app
)
101 if ((operace
==0)||(operace
==8)){ //zatim je jen jedno cislo
106 else{ //uz bylo vybrano a tak se to pouzije...
107 //zde by mela byt moznost scitani
112 * handler, ktery je v glade prirazen stisknuti tlacitka :
114 void on_button3_clicked (GtkObject
*object
, App
*app
)
116 if ((operace
==0)||(operace
==8)){ //zatim je jen jedno cislo
121 else{ //uz bylo vybrano a tak se to pouzije...
122 //zde by mela byt moznost scitani
127 * handler, ktery je v glade prirazen stisknuti tlacitka umocneni
129 void on_button4_clicked (GtkObject
*object
, App
*app
)
131 if ((operace
==0)||(operace
==8)){ //zatim je jen jedno cislo
136 else{ //uz bylo vybrano a tak se to pouzije...
137 //zde by mela byt moznost scitani
142 * handler, ktery je v glade prirazen stisknuti tlacitka log a rovnou vypocita
144 void on_button5_clicked (GtkObject
*object
, App
*app
)
146 hodnota1
=logaritmus(hodnota1
.result
);
147 if (hodnota1
.error
!=0){
148 gtk_label_set_text(app
->label1
,"ERROR");
156 char* x
= malloc(sizeof(char)*15);
157 sprintf(x
,"%.5f",hodnota1
.result
);
158 gtk_label_set_text(app
->label1
,x
);
160 operace
=0; //uz nebude mozne zadavat hodnotu 1
168 * handler, ktery je v glade prirazen stisknuti tlacitka faktorial a rovnou vypocita
170 void on_button6_clicked (GtkObject
*object
, App
*app
)
172 hodnota1
=faktorial(hodnota1
.result
);
173 if (hodnota1
.error
!=0){
174 gtk_label_set_text(app
->label1
,"ERROR");
182 char* x
= malloc(sizeof(char)*15);
183 sprintf(x
,"%.5f",hodnota1
.result
);
184 gtk_label_set_text(app
->label1
,x
);
186 operace
=0; //uz nebude mozne zadavat hodnotu 1
193 * handler, ktery vynuluje kalkulacku
195 void on_button7_clicked (GtkObject
*object
, App
*app
)
204 gtk_label_set_text(app
->label1
,"Kalkulacka BETON");
208 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
210 void on_button8_clicked (GtkObject
*object
, App
*app
)
214 char* x
= malloc(sizeof(char)*15);
217 hodnota1
.result
=hodnota1
.result
* 10 + 1;
220 hodnota1
.result
=hodnota1
.result
+ (1.0/pow(10,desetina
));
223 sprintf(x
,"%.5f",hodnota1
.result
);
224 gtk_label_set_text(app
->label1
,x
);
228 hodnota2
.result
=hodnota2
.result
* 10 + 1;
231 hodnota2
.result
=hodnota2
.result
+ (1.0/pow(10,desetina
));
234 sprintf(x
,"%.5f",hodnota2
.result
);
235 gtk_label_set_text(app
->label1
,x
);
241 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
243 void on_button9_clicked (GtkObject
*object
, App
*app
)
247 char* x
= malloc(sizeof(char)*15);
250 hodnota1
.result
=hodnota1
.result
* 10 + 2;
253 hodnota1
.result
=hodnota1
.result
+ (2.0/pow(10,desetina
));
256 sprintf(x
,"%.5f",hodnota1
.result
);
257 gtk_label_set_text(app
->label1
,x
);
261 hodnota2
.result
=hodnota2
.result
* 10 + 2;
264 hodnota2
.result
=hodnota2
.result
+ (2.0/pow(10,desetina
));
267 sprintf(x
,"%.5f",hodnota2
.result
);
268 gtk_label_set_text(app
->label1
,x
);
274 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
276 void on_button10_clicked (GtkObject
*object
, App
*app
)
280 char* x
= malloc(sizeof(char)*15);
283 hodnota1
.result
=hodnota1
.result
* 10 + 3;
286 hodnota1
.result
=hodnota1
.result
+ (3.0/pow(10,desetina
));
289 sprintf(x
,"%.5f",hodnota1
.result
);
290 gtk_label_set_text(app
->label1
,x
);
294 hodnota2
.result
=hodnota2
.result
* 10 + 3;
297 hodnota2
.result
=hodnota2
.result
+ (3.0/pow(10,desetina
));
300 sprintf(x
,"%.5f",hodnota2
.result
);
301 gtk_label_set_text(app
->label1
,x
);
307 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
309 void on_button11_clicked (GtkObject
*object
, App
*app
)
313 char* x
= malloc(sizeof(char)*15);
316 hodnota1
.result
=hodnota1
.result
* 10 + 4;
319 hodnota1
.result
=hodnota1
.result
+ (4.0/pow(10,desetina
));
322 sprintf(x
,"%.5f",hodnota1
.result
);
323 gtk_label_set_text(app
->label1
,x
);
327 hodnota2
.result
=hodnota2
.result
* 10 + 4;
330 hodnota2
.result
=hodnota2
.result
+ (4.0/pow(10,desetina
));
333 sprintf(x
,"%.5f",hodnota2
.result
);
334 gtk_label_set_text(app
->label1
,x
);
340 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
342 void on_button12_clicked (GtkObject
*object
, App
*app
)
346 char* x
= malloc(sizeof(char)*15);
349 hodnota1
.result
=hodnota1
.result
* 10 + 5;
352 hodnota1
.result
=hodnota1
.result
+ (5.0/pow(10,desetina
));
355 sprintf(x
,"%.5f",hodnota1
.result
);
356 gtk_label_set_text(app
->label1
,x
);
360 hodnota2
.result
=hodnota2
.result
* 10 + 5;
363 hodnota2
.result
=hodnota2
.result
+ (5.0/pow(10,desetina
));
366 sprintf(x
,"%.5f",hodnota2
.result
);
367 gtk_label_set_text(app
->label1
,x
);
373 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
375 void on_button13_clicked (GtkObject
*object
, App
*app
)
379 char* x
= malloc(sizeof(char)*15);
382 hodnota1
.result
=hodnota1
.result
* 10 + 6;
385 hodnota1
.result
=hodnota1
.result
+ (6.0/pow(10,desetina
));
388 sprintf(x
,"%.5f",hodnota1
.result
);
389 gtk_label_set_text(app
->label1
,x
);
393 hodnota2
.result
=hodnota2
.result
* 10 + 6;
396 hodnota2
.result
=hodnota2
.result
+ (6.0/pow(10,desetina
));
399 sprintf(x
,"%.5f",hodnota2
.result
);
400 gtk_label_set_text(app
->label1
,x
);
406 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
408 void on_button14_clicked (GtkObject
*object
, App
*app
)
412 char* x
= malloc(sizeof(char)*15);
415 hodnota1
.result
=hodnota1
.result
* 10 + 7;
418 hodnota1
.result
=hodnota1
.result
+ (7.0/pow(10,desetina
));
421 sprintf(x
,"%.5f",hodnota1
.result
);
422 gtk_label_set_text(app
->label1
,x
);
426 hodnota2
.result
=hodnota2
.result
* 10 + 7;
429 hodnota2
.result
=hodnota2
.result
+ (7.0/pow(10,desetina
));
432 sprintf(x
,"%.5f",hodnota2
.result
);
433 gtk_label_set_text(app
->label1
,x
);
439 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
441 void on_button15_clicked (GtkObject
*object
, App
*app
)
445 char* x
= malloc(sizeof(char)*15);
448 hodnota1
.result
=hodnota1
.result
* 10 + 8;
451 hodnota1
.result
=hodnota1
.result
+ (8.0/pow(10,desetina
));
454 sprintf(x
,"%.5f",hodnota1
.result
);
455 gtk_label_set_text(app
->label1
,x
);
459 hodnota2
.result
=hodnota2
.result
* 10 + 8;
462 hodnota2
.result
=hodnota2
.result
+ (8.0/pow(10,desetina
));
465 sprintf(x
,"%.5f",hodnota2
.result
);
466 gtk_label_set_text(app
->label1
,x
);
472 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
474 void on_button16_clicked (GtkObject
*object
, App
*app
)
478 char* x
= malloc(sizeof(char)*15);
481 hodnota1
.result
=hodnota1
.result
* 10 + 0;
484 hodnota1
.result
=hodnota1
.result
+ (0.0/pow(10,desetina
));
487 sprintf(x
,"%.5f",hodnota1
.result
);
488 gtk_label_set_text(app
->label1
,x
);
492 hodnota2
.result
=hodnota2
.result
* 10 + 0;
495 hodnota2
.result
=hodnota2
.result
+ (0.0/pow(10,desetina
));
498 sprintf(x
,"%.5f",hodnota2
.result
);
499 gtk_label_set_text(app
->label1
,x
);
505 * Nastavi desetinnou carku a pristi cislice jsou desetinna
507 void on_button17_clicked (GtkObject
*object
, App
*app
)
513 else{ //vypsani chyby pokud se vickrat klikne na desetinu
518 * Priradi cislici do hodnoty 1 nebo 2 v zavislosti na stavu kalkulacky dle operace a desetinne carky
520 void on_button18_clicked (GtkObject
*object
, App
*app
)
524 char* x
= malloc(sizeof(char)*15);
527 hodnota1
.result
=hodnota1
.result
* 10 + 9;
530 hodnota1
.result
=hodnota1
.result
+ (9.0/pow(10,desetina
));
533 sprintf(x
,"%.5f",hodnota1
.result
);
534 gtk_label_set_text(app
->label1
,x
);
538 hodnota2
.result
=hodnota2
.result
* 10 + 9;
541 hodnota2
.result
=hodnota2
.result
+ (9.0/pow(10,desetina
));
544 sprintf(x
,"%.5f",hodnota2
.result
);
545 gtk_label_set_text(app
->label1
,x
);
551 * Podle typu operace zavola prislusnou funkci z nasi uchvatne knihovny
553 void on_button19_clicked (GtkObject
*object
, App
*app
)
555 /* * 0 - nic, nebylo zadano
563 * 8 - rovnase - hodnota pro zmenu
565 char* x
= malloc(sizeof(char)*15);
568 hodnota1
=scitani(hodnota1
.result
, hodnota2
.result
);
569 sprintf(x
,"%.5f",hodnota1
.result
);
570 gtk_label_set_text(app
->label1
,x
);
575 hodnota1
=odcitani(hodnota1
.result
, hodnota2
.result
);
576 sprintf(x
,"%.5f",hodnota1
.result
);
577 gtk_label_set_text(app
->label1
,x
);
582 hodnota1
=nasobeni(hodnota1
.result
, hodnota2
.result
);
583 sprintf(x
,"%.5f",hodnota1
.result
);
584 gtk_label_set_text(app
->label1
,x
);
589 hodnota1
=deleni(hodnota1
.result
, hodnota2
.result
);
590 if (hodnota1
.error
!=0){
591 gtk_label_set_text(app
->label1
,"ERROR");
599 sprintf(x
,"%.5f",hodnota1
.result
);
600 gtk_label_set_text(app
->label1
,x
);
606 hodnota1
=umocneni(hodnota1
.result
, hodnota2
.result
);
607 sprintf(x
,"%.5f",hodnota1
.result
);
608 gtk_label_set_text(app
->label1
,x
);
619 * ukonci hlavni smycku gtk pri zavreni okna
621 void on_window_destroy (GtkObject
*object
, gpointer user_data
)
627 * Vynuluje globalni promenne a nastavi GTK a vytovori GUI.
629 int main (int argc
, char *argv
[])
638 // alokuje pamet pro app
639 app
= g_slice_new(App
);
641 gtk_init (&argc
, &argv
);
644 builder
= gtk_builder_new ();
645 gtk_builder_add_from_file (builder
, BUILDER_XML_FILE
, NULL
);
647 // priradi do struktury jednotlive widgety
648 app
->window
= GTK_WIDGET (gtk_builder_get_object (builder
, "window1"));
649 app
->button0
= GTK_WIDGET (gtk_builder_get_object (builder
, "button0"));
650 app
->button1
= GTK_WIDGET (gtk_builder_get_object (builder
, "button1"));
651 app
->button2
= GTK_WIDGET (gtk_builder_get_object (builder
, "button2"));
652 app
->button3
= GTK_WIDGET (gtk_builder_get_object (builder
, "button3"));
653 app
->button4
= GTK_WIDGET (gtk_builder_get_object (builder
, "button4"));
654 app
->button5
= GTK_WIDGET (gtk_builder_get_object (builder
, "button5"));
655 app
->button6
= GTK_WIDGET (gtk_builder_get_object (builder
, "button6"));
656 app
->button7
= GTK_WIDGET (gtk_builder_get_object (builder
, "button7"));
657 app
->button8
= GTK_WIDGET (gtk_builder_get_object (builder
, "button8"));
658 app
->button9
= GTK_WIDGET (gtk_builder_get_object (builder
, "button9"));
659 app
->button10
= GTK_WIDGET (gtk_builder_get_object (builder
, "button10"));
660 app
->button11
= GTK_WIDGET (gtk_builder_get_object (builder
, "button11"));
661 app
->button12
= GTK_WIDGET (gtk_builder_get_object (builder
, "button12"));
662 app
->button13
= GTK_WIDGET (gtk_builder_get_object (builder
, "button13"));
663 app
->button14
= GTK_WIDGET (gtk_builder_get_object (builder
, "button14"));
664 app
->button15
= GTK_WIDGET (gtk_builder_get_object (builder
, "button15"));
665 app
->button16
= GTK_WIDGET (gtk_builder_get_object (builder
, "button16"));
666 app
->button17
= GTK_WIDGET (gtk_builder_get_object (builder
, "button17"));
667 app
->button18
= GTK_WIDGET (gtk_builder_get_object (builder
, "button18"));
668 app
->button19
= GTK_WIDGET (gtk_builder_get_object (builder
, "button19"));
669 app
->label1
= GTK_LABEL (gtk_builder_get_object (builder
, "label1"));
671 gtk_builder_connect_signals (builder
, app
);
673 g_object_unref (G_OBJECT (builder
));
675 gtk_widget_show (app
->window
);