// gui.c #include "gui.h" #include #include #include #include #include void initialiser_interface_graphique(int argc, char *argv[]) { // Initialisation de l'interface graphique GTK gtk_init(&argc, &argv); } // Définition de la structure InfoTraduction pour les deux directions static InfoTraduction infoTraductionFrEn = {"fr-en", "dicoE.txt"}; static InfoTraduction infoTraductionEnFr = {"en-fr", "dicoF.txt"}; void creer_fenetre_principale(void) { GtkWidget *fenetre; GtkWidget *bouton_traduction, *bouton_ajout_mot; GtkWidget *radio_fr_en, *radio_en_fr, *radio_ajout_fr_en, *radio_ajout_en_fr; GtkWidget *grid; // Créez la fenêtre principale ici fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(fenetre), "Programme de Traduction"); gtk_window_set_default_size(GTK_WINDOW(fenetre), 400, 300); g_signal_connect(G_OBJECT(fenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL); // Créez un conteneur de type GtkGrid grid = gtk_grid_new(); gtk_grid_set_row_spacing(GTK_GRID(grid), 5); gtk_grid_set_column_spacing(GTK_GRID(grid), 5); // Créez des boutons radio pour les options de traduction radio_fr_en = gtk_radio_button_new_with_label(NULL, "Traduire du français vers l'anglais"); radio_en_fr = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_fr_en), "Traduire de l'anglais vers le français"); // Créez des boutons radio pour les options d'ajout de mots radio_ajout_fr_en = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_en_fr), "Ajouter un mot dans le dictionnaire français-anglais"); radio_ajout_en_fr = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_ajout_fr_en), "Ajouter un mot dans le dictionnaire anglais-français"); // Créez un bouton pour la traduction bouton_traduction = creer_bouton_traduction("Traduire", G_CALLBACK(afficher_boite_dialogue_traduction), &infoTraductionFrEn); // Créez un bouton pour ajouter un mot dans le dictionnaire bouton_ajout_mot = creer_bouton_traduction("Ajouter Mot", G_CALLBACK(afficher_boite_dialogue_ajout_mot), &infoTraductionFrEn); // Ajoutez les widgets au GtkGrid gtk_grid_attach(GTK_GRID(grid), radio_fr_en, 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(grid), radio_en_fr, 0, 1, 1, 1); gtk_grid_attach(GTK_GRID(grid), radio_ajout_fr_en, 0, 2, 1, 1); gtk_grid_attach(GTK_GRID(grid), radio_ajout_en_fr, 0, 3, 1, 1); gtk_grid_attach(GTK_GRID(grid), bouton_traduction, 1, 0, 1, 1); gtk_grid_attach(GTK_GRID(grid), bouton_ajout_mot, 1, 1, 1, 1); // Connectez le signal "toggled" des boutons radio à une fonction de rappel g_signal_connect(G_OBJECT(radio_fr_en), "toggled", G_CALLBACK(on_radio_toggled), &infoTraductionFrEn); g_signal_connect(G_OBJECT(radio_en_fr), "toggled", G_CALLBACK(on_radio_toggled), &infoTraductionEnFr); g_signal_connect(G_OBJECT(radio_ajout_fr_en), "toggled", G_CALLBACK(on_radio_toggled_ajout_mot), &infoTraductionFrEn); g_signal_connect(G_OBJECT(radio_ajout_en_fr), "toggled", G_CALLBACK(on_radio_toggled_ajout_mot), &infoTraductionEnFr); // Ajoutez le GtkGrid à la fenêtre principale gtk_container_add(GTK_CONTAINER(fenetre), grid); gtk_widget_show_all(fenetre); gtk_main(); // À décommenter lorsque vous êtes prêt à lancer la boucle principale GTK } GtkWidget* creer_bouton_traduction(const gchar *label, GCallback callback, gpointer user_data) { // Crée un bouton GTK avec l'étiquette spécifiée GtkWidget *bouton = gtk_button_new_with_label(label); // Connecte le signal "clicked" du bouton à la fonction de rappel spécifiée g_signal_connect(G_OBJECT(bouton), "clicked", callback, user_data); return bouton; } void afficher_message(const gchar *message) { // Crée une boîte de dialogue d'information avec le message spécifié GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", message); // Exécute la boîte de dialogue et la détruit ensuite gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } gboolean ajouterMot(const gchar *mot, const gchar *traduction, const gchar *direction, const gchar *fichier) { // Ouvre le fichier en mode ajout FILE *file = fopen(fichier, "a"); if (file == NULL) { // Gestion de l'erreur en cas d'échec de l'ouverture du fichier fprintf(stderr, "Erreur lors de l'ouverture du fichier de dictionnaire pour l'ajout de mot.\n"); return FALSE; } // Écrit le mot et sa traduction dans le fichier fprintf(file, "%s:%s\n", mot, traduction); // Ferme le fichier fclose(file); return TRUE; } void afficher_boite_dialogue_ajout_mot(InfoTraduction *info, const gchar *direction) { GtkWidget *dialog; GtkWidget *labelMot, *labelTraduction, *entryMot, *entryTraduction; GtkDialogFlags flags = GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT; // Crée une boîte de dialogue pour ajouter un mot dialog = gtk_dialog_new_with_buttons("Ajouter Mot", NULL, flags, "OK", GTK_RESPONSE_ACCEPT, "Annuler", GTK_RESPONSE_CANCEL, NULL); labelMot = gtk_label_new("Entrez le mot : "); entryMot = gtk_entry_new(); labelTraduction = gtk_label_new("Entrez la traduction : "); entryTraduction = gtk_entry_new(); // Ajoute les champs de texte et les étiquettes à la boîte de dialogue gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), labelMot, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entryMot, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), labelTraduction, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entryTraduction, TRUE, TRUE, 0); // Affiche tous les éléments de la boîte de dialogue gtk_widget_show_all(dialog); // Exécute la boîte de dialogue et gère la réponse gint result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_ACCEPT) { // Récupère les textes saisis dans les champs de texte const gchar *mot = gtk_entry_get_text(GTK_ENTRY(entryMot)); g_print("Direction avant traduction : %s\n", info->direction); const gchar *traduction = gtk_entry_get_text(GTK_ENTRY(entryTraduction)); g_print("Traduction : %s\n", traduction); // Vérifie l'existence du mot dans le dictionnaire if (motExiste(mot, direction)) { afficher_message(g_strdup_printf("Le mot '%s' existe déjà dans le dictionnaire.", mot)); } else { // Ajoute le mot dans le dictionnaire if (ajouterMot(mot, traduction, direction, info->fichier)) { afficher_message(g_strdup_printf("Le mot '%s' a été ajouté dans le dictionnaire.", mot)); } else { afficher_message("Erreur lors de l'ajout du mot dans le dictionnaire."); } } } // Ferme la boîte de dialogue gtk_widget_destroy(dialog); } void on_radio_toggled(GtkToggleButton *button, InfoTraduction *info) { if (gtk_toggle_button_get_active(button)) { const gchar *label = gtk_button_get_label(GTK_BUTTON(button)); if (strcmp(label, "Traduire du français vers l'anglais") == 0) { info->direction = "fr-en"; } else if (strcmp(label, "Traduire de l'anglais vers le français") == 0) { info->direction = "en-fr"; } g_print("Direction mise à jour : %s\n", info->direction); } } void on_radio_toggled_ajout_mot(GtkToggleButton *button, InfoTraduction *info) { if (gtk_toggle_button_get_active(button)) { const gchar *label = gtk_button_get_label(GTK_BUTTON(button)); if (label != NULL && strlen(label) > 0 && !isspace(label[0])) { if (strcmp(label, "Ajouter un mot dans le dictionnaire français-anglais") == 0) { info->direction = "fr-en"; } else if (strcmp(label, "Ajouter un mot dans le dictionnaire anglais-français") == 0) { info->direction = "en-fr"; } } else { afficher_message("Direction de traduction non valide."); } } } const gchar* traduire(const gchar *mot, const gchar *direction, const gchar *fichierParam) { const gchar *fichier = (strcmp(direction, "fr-en") == 0) ? "dicoE.txt" : "dicoF.txt"; // Débogage : Affiche le chemin du fichier g_print("Chemin du fichier : %s\n", fichier); FILE *file = fopen(fichier, "r"); if (file == NULL) { fprintf(stderr, "Erreur lors de l'ouverture du fichier de dictionnaire pour la traduction.\n"); return NULL; } char ligne[256]; char motTraduit[256]; while (fgets(ligne, sizeof(ligne), file)) { char *token = strtok(ligne, ":"); if (token != NULL && strcmp(token, mot) == 0) { token = strtok(NULL, ":"); strcpy(motTraduit, token); fclose(file); return g_strdup(motTraduit); } } fclose(file); return NULL; } gboolean motExiste(const gchar *mot, const gchar *direction) { // Détermine le fichier à ouvrir en fonction de la direction const gchar *fichier = (strcmp(direction, "fr-en") == 0) ? "dicoE.txt" : "dicoF.txt"; // Ouvre le fichier en mode lecture FILE *file = fopen(fichier, "r"); if (file == NULL) { // Gestion de l'erreur en cas d'échec de l'ouverture du fichier fprintf(stderr, "Erreur lors de l'ouverture du fichier de dictionnaire.\n"); return FALSE; } char ligne[256]; // Parcourt chaque ligne du fichier while (fgets(ligne, sizeof(ligne), file)) { // Utilise strtok pour séparer le mot de sa traduction char *token = strtok(ligne, ":"); if (token != NULL && strcmp(token, mot) == 0) { fclose(file); return TRUE; } } // Ferme le fichier fclose(file); return FALSE; } void afficher_boite_dialogue_traduction(InfoTraduction *info) { GtkWidget *dialog; GtkWidget *label, *entry; GtkDialogFlags flags = GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT; // Crée une boîte de dialogue pour la traduction dialog = gtk_dialog_new_with_buttons("Traduction", NULL, flags, "OK", GTK_RESPONSE_ACCEPT, "Annuler", GTK_RESPONSE_CANCEL, NULL); label = gtk_label_new("Entrez le mot à traduire : "); entry = gtk_entry_new(); // Ajoute les champs de texte et les étiquettes à la boîte de dialogue gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry, TRUE, TRUE, 0); // Affiche tous les éléments de la boîte de dialogue gtk_widget_show_all(dialog); // Exécute la boîte de dialogue et gère la réponse gint result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_ACCEPT) { // Récupère le texte saisi dans le champ de texte const gchar *mot = gtk_entry_get_text(GTK_ENTRY(entry)); const gchar *traduction = traduire(mot, info->direction, info->fichier); if (traduction) { // Affiche le résultat de la traduction dans une boîte de message afficher_message(g_strdup_printf("Traduction de '%s' : '%s'", mot, traduction)); } else { afficher_message(g_strdup_printf("Le mot '%s' n'a pas pu être traduit.", mot)); } } // Ferme la boîte de dialogue gtk_widget_destroy(dialog); }