#include #include #include #define FLECHE_DROITE 1 #define FLECHE_GAUCHE 2 #define FLECHE_HAUT 4 #define FLECHE_BAS 8 #define COIN_HAUT_DROITE 1 #define COIN_HAUT_GAUCHE 2 #define COIN_BAS_DROITE 4 #define COIN_BAS_GAUCHE 8 #define ECART 8 GdkFont *font1; GdkFont *font2; void close_application( GtkWidget *widget, gpointer data ) { gtk_main_quit(); } void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } /* On donne le point en haut du bus */ void dessine_large_fleche_hz (GdkDrawable *d, GdkGC *gc, int x, int y, int fleches) { int delta_x = ECART / 2 * (fleches & FLECHE_DROITE ? 1 : -1); int delta_y = ECART / 2; gdk_draw_line (d, gc, x - delta_x, y - delta_y, x + delta_x, y + delta_y); gdk_draw_line (d, gc, x + delta_x, y + delta_y, x - delta_x, y + delta_y + ECART); } /* On donne le point à droite du bus */ void dessine_large_fleche_vert (GdkDrawable *d, GdkGC *gc, int x, int y, int fleches) { int delta_x = ECART / 2; int delta_y = ECART / 2 * (fleches & FLECHE_HAUT ? 1 : -1); gdk_draw_line (d, gc, x - delta_x, y + delta_y, x + delta_x, y - delta_y); gdk_draw_line (d, gc, x + delta_x, y - delta_y, x + delta_x + ECART, y + delta_y); } /* On donne le point en haut à gauche du bus, les flèches sont rajoutées */ void dessine_bus_hz (GdkDrawable *d, GdkGC *gc, int x, int y, int longueur, int fleches, int coins) { gdk_draw_line (d, gc, x - (coins & COIN_HAUT_GAUCHE ? ECART : 0), y, x + longueur + (coins & COIN_HAUT_DROITE ? ECART : 0), y); gdk_draw_line (d, gc, x - (coins & COIN_BAS_GAUCHE ? ECART : 0), y + ECART, x + longueur + (coins & COIN_BAS_DROITE ? ECART : 0), y + ECART); if (fleches & FLECHE_GAUCHE) dessine_large_fleche_hz (d, gc, x, y, FLECHE_GAUCHE); if (fleches & FLECHE_DROITE) dessine_large_fleche_hz (d, gc, x + longueur, y, FLECHE_DROITE); } void dessine_bus_vert (GdkDrawable *d, GdkGC *gc, int x, int y, int hauteur, int fleches, int coins) { gdk_draw_line (d, gc, x, y - (coins & COIN_HAUT_GAUCHE ? ECART : 0), x, y + hauteur + (coins & COIN_BAS_GAUCHE ? ECART : 0)); gdk_draw_line (d, gc, x + ECART, y - (coins & COIN_HAUT_DROITE ? ECART : 0), x + ECART, y + hauteur + (coins & COIN_BAS_DROITE ? ECART : 0)); if (fleches & FLECHE_HAUT) dessine_large_fleche_vert (d, gc, x, y, FLECHE_HAUT); if (fleches & FLECHE_BAS) dessine_large_fleche_vert (d, gc, x, y + hauteur, FLECHE_BAS); } gboolean dessine (GtkWidget *zone_dessin, GdkEventExpose *ev) { GdkColor gdk_color; GdkColormap *colormap; GdkGC *gc; colormap = gdk_window_get_colormap (zone_dessin->window); gc = gdk_gc_new (zone_dessin->window); gdk_color.red = 0xDFFF; gdk_color.green = 0xDFFF; gdk_color.blue = 0xEFFF; gdk_color_alloc (colormap, &gdk_color); gdk_window_set_background (zone_dessin->window, &gdk_color); gdk_color.red = 0; gdk_color.green = 0; gdk_color.blue = 0; gdk_color_alloc (colormap, &gdk_color); gdk_gc_set_foreground (gc, &gdk_color); gdk_draw_string (zone_dessin->window, font1, gc, 100, 100, "Salut"); dessine_bus_hz (zone_dessin->window, gc, 50, 50, 200, FLECHE_GAUCHE | FLECHE_DROITE, 0); dessine_bus_vert (zone_dessin->window, gc, 250, 250, 200, FLECHE_HAUT | FLECHE_BAS, 0); return TRUE; } void creation_menu (GtkWidget *boite) { GtkWidget *barre_menu; GtkWidget *item_fichier; barre_menu = gtk_menu_bar_new (); item_fichier = gtk_menu_item_new_with_label ("Fichier"); gtk_menu_bar_append (GTK_MENU_BAR (barre_menu), item_fichier); gtk_box_pack_start (GTK_BOX (boite), barre_menu, FALSE, FALSE, 2); } void creation_bouton (GtkWidget *boite) { GtkWidget *boite_boutons; GtkWidget *bouton_cycle; GtkWidget *bouton_recharge; boite_boutons = gtk_hbox_new (FALSE, 10); bouton_cycle = gtk_button_new_with_label ("Prochain cycle"); /*gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(close_application), NULL);*/ bouton_recharge = gtk_button_new_with_label ("Recharge"); /*GTK_WIDGET_SET_FLAGS (bouton_cycle, GTK_CAN_DEFAULT); gtk_widget_grab_default (bouton_cycle);*/ gtk_box_pack_start (GTK_BOX (boite_boutons), bouton_cycle, TRUE, TRUE, 3); gtk_box_pack_end (GTK_BOX (boite_boutons), bouton_recharge, TRUE, TRUE, 3); gtk_box_pack_end (GTK_BOX (boite), boite_boutons, TRUE, TRUE, 0); } GtkWidget * creation_dessin (GtkWidget *boite) { GtkWidget *fenetre_dessin; GtkWidget *zone_dessin; zone_dessin = gtk_drawing_area_new (); gtk_drawing_area_size (GTK_DRAWING_AREA (zone_dessin), 875, 775); fenetre_dessin = gtk_viewport_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (fenetre_dessin), zone_dessin); gtk_box_pack_start (GTK_BOX (boite), fenetre_dessin, TRUE, TRUE, 0); return zone_dessin; } void creation_separateur (GtkWidget *boite) { GtkWidget *separator; separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (boite), separator, TRUE, TRUE, 0); } main(int argc, char *argv[]) { GtkWidget *text; GdkColor color; GtkWidget *fenetre; GtkWidget *boite1; GtkWidget *zone_dessin; gtk_init (&argc, &argv); fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize (fenetre, 900, 900); /* Redimensionnement */ gtk_window_set_policy (GTK_WINDOW(fenetre), TRUE, TRUE, FALSE); /* Fonction appelée par la fermeture sur la barre */ gtk_signal_connect (GTK_OBJECT (fenetre), "destroy", GTK_SIGNAL_FUNC(close_application), NULL); gtk_window_set_title (GTK_WINDOW (fenetre), "Gsimulateur - BLEC"); /* Espace de la fenêtre principale avec les composants */ gtk_container_set_border_width (GTK_CONTAINER (fenetre), 10); boite1 = gtk_vbox_new (FALSE, 10); gtk_container_add (GTK_CONTAINER (fenetre), boite1); creation_menu (boite1); zone_dessin = creation_dessin (boite1); creation_separateur (boite1); creation_bouton (boite1); font1 = gdk_font_load ("-adobe-courier-medium-r-normal--14-140-75-75-m-90-iso8859-1"); font2 = gdk_font_load ("-adobe-courier-bold-r-normal--14-140-75-75-m-90-iso8859-1"); gtk_signal_connect (GTK_OBJECT (zone_dessin), "expose_event", (GtkSignalFunc) dessine, NULL); gtk_widget_show_all (fenetre); dessine (zone_dessin, NULL); gtk_main (); }