/* Example1.cpp */
#include <cairo.h>
#include <gtk/gtk.h>
 
#define UI_FILE "mainForm.glade"

// описание виджетов
GtkBuilder *builder;
GtkWidget *topWindow;
GtkRadioButton *rbutRectangle, *rbutEllipse, *rbutTriangle;
GtkDrawingArea *drawingarea;

// описание обработчиков сигналов
extern "C" void topWindow_destroy_cb (GtkWidget *object, gpointer user_data);
extern "C" gboolean drawingarea_draw_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data);
extern "C" void rbutton_toggled_cb (GtkWidget *object);
 
int main( int argc, char **argv )
{
    GError *error = NULL;

    // инициализация GTK+
    gtk_init( &argc, &argv );
 
   // создание нового GtkBuilder объекта
    builder = gtk_builder_new();

    // загрузка пользовательского интерфеса из файла, который мы создали в Glade 
    if( ! gtk_builder_add_from_file( builder, UI_FILE, &error ) )
    {
        g_warning( "%s", error->message );
        g_free( error );
        return( 1 );
    }
 
   // связывание наших виджетов с описаннимем виджетов в GladeXML
   topWindow = GTK_WIDGET(gtk_builder_get_object(builder, "topWindow"));
   rbutRectangle = GTK_RADIO_BUTTON(gtk_builder_get_object(builder, "rbutRectangle"));
   rbutEllipse = GTK_RADIO_BUTTON(gtk_builder_get_object(builder, "rbutEllipse"));
   rbutTriangle = GTK_RADIO_BUTTON(gtk_builder_get_object(builder, "rbutTriangle"));
   drawingarea = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "drawingarea"));

   // связываем сигналы с объектами графического интерфейса
   gtk_builder_connect_signals (builder, NULL);   

   // освобождение памяти
   g_object_unref( G_OBJECT( builder ) );
 
   // Показываем форму и виджеты на ней
   gtk_widget_show( topWindow ); 
 
   // запуск главного цикла приложения
   gtk_main();

   return( 0 );
}

// закрытие приложения
void topWindow_destroy_cb (GtkWidget *object, gpointer user_data)
{
 // завершаем главный цикл приложения
 gtk_main_quit();
}

// перерисовка холста
gboolean drawingarea_draw_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
  cairo_t *cr;

  cr = gdk_cairo_create (gtk_widget_get_window (widget));
  cairo_set_line_width (cr, 7);
  cairo_set_source_rgb (cr, 0, 0, 0);

   // переключатель установлен на прямоугольник
   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutRectangle)))
   {   
    // рисуем прямоугольник
    cairo_rectangle (cr, 20, 20, 200, 100);
    cairo_stroke_preserve(cr);
    cairo_set_source_rgb(cr, 0, 0.8, 0); 
   }

   // переключатель установлен на эллипс
   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutEllipse)))
   {
    // рисуем эллипс
    cairo_arc(cr, 150, 100, 90, 0, 2 * 3.14);
    cairo_stroke_preserve(cr);
    cairo_set_source_rgb(cr, 0.8, 0, 0); 
   }

   // переключатель установлен на треугольник
   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutTriangle)))
   {
    // рисуем треугольник
    cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); 
    cairo_move_to (cr, 40, 40);
    cairo_line_to (cr, 200, 40);
    cairo_line_to (cr, 120, 160);
    cairo_line_to (cr, 40, 40); 
    cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); 
    cairo_stroke_preserve(cr);
    cairo_set_source_rgb(cr, 0.8, 0, 0.8); 
   } 

  cairo_fill(cr);

  cairo_destroy(cr);

  return FALSE;
}

void rbutton_toggled_cb (GtkWidget *object)
{
 // перерисовка drawingarea
 gtk_widget_queue_draw (GTK_WIDGET(drawingarea));
}