Save/Load allows editing very long file names, still imperfect
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@157 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
		
							parent
							
								
									87c3f89763
								
							
						
					
					
						commit
						9cae113c99
					
				@ -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.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								const.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								files.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										85
									
								
								readline.c
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								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=(Taille<Taille_maxi)? Taille:Taille-1;
 | 
			
		||||
  Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,Position);
 | 
			
		||||
  // 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 + 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) && (Position<Taille_maxi-1))
 | 
			
		||||
              Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,++Position);
 | 
			
		||||
            {
 | 
			
		||||
              Position++;
 | 
			
		||||
              //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 ((Position<Taille) && (Position<Taille_maxi-1))
 | 
			
		||||
              Rafficher_toute_la_chaine(Pos_X,Pos_Y,Chaine,Position=(Taille<Taille_maxi)?Taille:Taille-1);
 | 
			
		||||
            {
 | 
			
		||||
              Position=(Taille<Taille_maxi)?Taille:Taille-1;
 | 
			
		||||
              if (Position-Offset>Taille_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_maxi)
 | 
			
		||||
            {
 | 
			
		||||
              Position++;
 | 
			
		||||
              //if (Position > Taille_affichee + Offset - 2 && !(Position<Taille) && (Position<Taille_maxi-1))
 | 
			
		||||
              //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++;
 | 
			
		||||
            }
 | 
			
		||||
            // 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"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user