From 9cae113c99b0a3421d9a1b2c3e5c77ba1f580494 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Tue, 16 Sep 2008 00:28:22 +0000 Subject: [PATCH] Save/Load allows editing very long file names, still imperfect git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@157 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 2 +- const.h | 4 +++ files.c | 4 --- readline.c | 85 +++++++++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 76 insertions(+), 19 deletions(-) diff --git a/boutons.c b/boutons.c index 274b53c9..6b101e8f 100644 --- a/boutons.c +++ b/boutons.c @@ -2593,7 +2593,7 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) break; case 8 : // Saisie du nom de fichier Effacer_curseur(); - if (Readline(13+9*8,90,Principal_Nom_fichier,27,2)) + if (Readline(13+9*8,90,Principal_Nom_fichier,50,2)) { // On regarde s'il faut rajouter une extension. C'est-à-dire s'il // n'y a pas de '.' dans le nom du fichier. diff --git a/const.h b/const.h index 935bd736..8e9e8b11 100644 --- a/const.h +++ b/const.h @@ -47,6 +47,10 @@ #define NB_SECTIONS_AIDE 3 // Nombre de sections dans l'aide #define TAILLE_CHEMIN_FICHIER 260 // Le nombre de caractères maxi pour un nom de fichier avec chemin complet +// Caractères présents dans les deux fontes +#define CARACTERE_TRIANGLE_DROIT 16 +#define CARACTERE_TRIANGLE_GAUCHE 17 + // On impose à l'allocation dynamique des pages de backups de conserver un // minimum de 256 Ko pour que le reste du programme puisse continuer à // fonctionner. diff --git a/files.c b/files.c index ac89a449..3ddb8d01 100644 --- a/files.c +++ b/files.c @@ -35,10 +35,6 @@ #define COULEUR_REPERTOIRE_SELECT CM_Clair // Couleur du texte pour une ligne de repértoire sélectionnée #define COULEUR_FOND_SELECT CM_Fonce // Couleur du fond pour une ligne sélectionnée -// Caractères présents dans les deux fontes -#define CARACTERE_TRIANGLE_DROIT 16 -#define CARACTERE_TRIANGLE_GAUCHE 17 - #define FILENAMESPACE 16 int Determiner_repertoire_courant(void) diff --git a/readline.c b/readline.c index 703dfd99..87b7a031 100644 --- a/readline.c +++ b/readline.c @@ -13,6 +13,7 @@ #include "graph.h" #include "divers.h" #include "erreurs.h" +#include "const.h" #ifdef __linux__ #include "linux.h" @@ -91,15 +92,24 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai // 0: Sortie par annulation (Esc.) / 1: sortie par acceptation (Return) { char Chaine_initiale[256]; + char Chaine_affichee[256]; byte Position; byte Taille; word Touche_lue=0; byte Touche_autorisee; + byte Taille_affichee; + // Grosse astuce pour les noms de fichiers: La taille affichée est différente + // de la taille maximum gérée. + if (Type_saisie == 2) + Taille_affichee = 27; + else + Taille_affichee = Taille_maxi; + byte Offset=0; // Indice du premier caractère affiché // Effacement de la chaîne Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), - Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); + Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); // Mise à jour des variables se rapportant à la chaîne en fonction de la chaîne initiale strcpy(Chaine_initiale,Chaine); @@ -108,9 +118,18 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai itoa(atoi(Chaine),Chaine,10); // On tasse la chaine à gauche // Chaine[0]='\0'; // On efface la chaîne si c'est valeur numérique + Taille=strlen(Chaine); Position=(Taille0) + Chaine_affichee[0]=CARACTERE_TRIANGLE_GAUCHE; + if (Taille_affichee + Offset + 1 < Taille ) + Chaine_affichee[Taille_affichee-1]=CARACTERE_TRIANGLE_DROIT; + + Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine_affichee,Position - Offset); while ((Touche_lue!=SDLK_RETURN) && (Touche_lue!=SDLK_ESCAPE)) @@ -123,25 +142,36 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai { Supprimer_caractere(Chaine,Position); Taille--; + // Effacement de la chaîne Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), - Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); - Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,Position); + Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); + goto affichage; } break; case SDLK_LEFT : // Gauche - if (Position) + if (Position>0) { // Effacement de la chaîne if (Position==Taille) Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), - Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); - Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,--Position); + Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); + Position--; + if (Offset > 0 && (Position == 0 || Position < (Offset + 1))) + Offset--; + goto affichage; } break; case SDLK_RIGHT : // Droite if ((Position Taille_affichee + Offset - 2) + //if (Offset + Taille_affichee < Taille_maxi && (Position == Taille || (Position > Taille_affichee + Offset - 2))) + if (Chaine_affichee[Position-Offset]==CARACTERE_TRIANGLE_DROIT || Position-Offset>=Taille_affichee) + Offset++; + goto affichage; + } break; case SDLK_HOME : // Home if (Position) @@ -149,13 +179,20 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai // Effacement de la chaîne if (Position==Taille) Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), - Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); - Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,Position=0); + Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); + Position = 0; + Offset = 0; + goto affichage; } break; case SDLK_END : // End if ((PositionTaille_affichee) + Offset=Position-Taille_affichee+1; + goto affichage; + } break; case SDLK_BACKSPACE : if (Position) @@ -164,8 +201,8 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai Taille--; // Effacement de la chaîne Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), - Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); - Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,Position); + Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); + goto affichage; } break; case SDLK_RETURN : @@ -206,11 +243,31 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai Taille++; // et qui risque de déplacer le curseur vers la droite if (Taille Taille_affichee + Offset - 2 && !(Position Taille_affichee + Offset - 2))) + if (Chaine_affichee[Position-Offset]==CARACTERE_TRIANGLE_DROIT || Position-Offset>=Taille_affichee) + Offset++; + } // Enfin, on raffiche la chaine - Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,Position); + goto affichage; } // Fin du test d'autorisation de touche } // Fin du test de place libre + break; + + affichage: + Taille=strlen(Chaine); + // Formatage d'une partie de la chaine (si trop longue pour tenir) + strncpy(Chaine_affichee, Chaine + Offset, Taille_affichee); + Chaine_affichee[Taille_affichee]='\0'; + if (Offset>0) + Chaine_affichee[0]=CARACTERE_TRIANGLE_GAUCHE; + if (Taille_affichee + Offset + 0 < Taille ) + Chaine_affichee[Taille_affichee-1]=CARACTERE_TRIANGLE_DROIT; + + Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine_affichee,Position - Offset); + } // Fin du "switch(Touche_lue)" } // Fin du "while"