Save/Load: Fixed backspace, limit 255 characters, various fixes for long filenames,

(linux) drive '~' uses $HOME environment variable.
Fixed some more struct packing issues (ex: GIF saving)

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@163 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2008-09-25 16:37:50 +00:00
parent 2a66650568
commit ca8be4e399
7 changed files with 86 additions and 43 deletions

View File

@ -2133,7 +2133,7 @@ void Print_Nom_fichier_dans_selecteur(void)
//
{
Block(Fenetre_Pos_X+(Menu_Facteur_X*(13+9*8)),Fenetre_Pos_Y+(Menu_Facteur_Y*90),Menu_Facteur_X*(27*8),Menu_Facteur_Y<<3,CM_Clair);
Print_dans_fenetre(13+9*8,90,Principal_Nom_fichier,CM_Noir,CM_Clair);
Print_dans_fenetre_limite(13+9*8,90,Principal_Nom_fichier,27,CM_Noir,CM_Clair);
}
@ -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,50,2))
if (Readline(13+9*8,90,Principal_Nom_fichier,27,2))
{
// On regarde s'il faut rajouter une extension. C'est-à-dire s'il
// n'y a pas de '.' dans le nom du fichier.

58
graph.c
View File

@ -542,7 +542,7 @@ void Liste2tables(word * Liste,short Pas,byte Mode,byte * Table_inc,byte * Table
}
// Transformer un nombre (entier naturel) en chaŒne
// Transformer un nombre (entier naturel) en chaîne
void Num2str(dword Nombre,char * Chaine,byte Taille)
{
int Indice;
@ -558,7 +558,7 @@ void Num2str(dword Nombre,char * Chaine,byte Taille)
Chaine[Taille]='\0';
}
// Transformer une chaŒne en un entier naturel (renvoie -1 si ch. invalide)
// Transformer une chaîne en un entier naturel (renvoie -1 si ch. invalide)
int Str2num(char * Chaine)
{
int Valeur=0;
@ -1032,14 +1032,14 @@ void Afficher_pixel(word X,word Y,byte Couleur)
// -- Interface avec le menu et les fenêtres ---------------------------------
// Affichage d'un pixel dans le menu (le menu doŒt être visible)
// Affichage d'un pixel dans le menu (le menu doît être visible)
void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur)
{
Block_Fast(X*Menu_Facteur_X,(Y*Menu_Facteur_Y)+Menu_Ordonnee,Menu_Facteur_X,Menu_Facteur_Y,Couleur);
}
// Affichage d'un pixel dans la fenêtre (la fenêtre doŒt être visible)
// Affichage d'un pixel dans la fenêtre (la fenêtre doît être visible)
void Pixel_dans_fenetre(word X,word Y,byte Couleur)
{
@ -1354,7 +1354,7 @@ unsigned char Caractere_OEM[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
// -- Affichage de texte -----------------------------------------------------
// -- Afficher une chaŒne n'importe o— à l'écran --
// -- Afficher une chaîne n'importe où à l'écran --
void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
{
@ -1388,10 +1388,9 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur
// -- Afficher un caractère dans une fenêtre --
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond)
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond)
{
short X,Y;
Pos_X=(Pos_X*Menu_Facteur_X)+Fenetre_Pos_X;
Pos_Y=(Pos_Y*Menu_Facteur_Y)+Fenetre_Pos_Y;
@ -1404,7 +1403,7 @@ void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur
// -- Afficher un caractère sans fond dans une fenêtre --
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur)
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur)
{
short X,Y;
@ -1420,7 +1419,23 @@ void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,
}
}
// -- Afficher une chaŒne dans une fenêtre --
// -- Afficher une chaîne dans une fenêtre, avec taille maxi --
void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond)
{
char Chaine_affichee[256];
strncpy(Chaine_affichee, Chaine, Taille);
Chaine_affichee[255]='\0';
if (strlen(Chaine_affichee) > Taille)
{
Chaine_affichee[Taille-1]=CARACTERE_TRIANGLE_DROIT;
Chaine_affichee[Taille]='\0';
}
Print_dans_fenetre(X, Y, Chaine_affichee, Couleur_texte, Couleur_fond);
}
// -- Afficher une chaîne dans une fenêtre --
void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
{
@ -1429,7 +1444,7 @@ void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Co
Chaine,Couleur_texte,Couleur_fond);
}
// -- Afficher une chaŒne dans le menu --
// -- Afficher une chaîne dans le menu --
void Print_dans_menu(char * Chaine, short Position)
{
@ -1473,15 +1488,24 @@ void Print_coordonnees(void)
void Print_nom_fichier(void)
{
short Debut_X;
if (Menu_visible)
{
// Si le nom de fichier fait plus de 12 caractères, on n'affiche que les 12 derniers
char * Nom_affiche = Principal_Nom_fichier;
int Taille_nom =strlen(Principal_Nom_fichier);
if (Taille_nom>12)
{
Nom_affiche=Principal_Nom_fichier + Taille_nom - 12;
Taille_nom = 12;
}
Block((LARGEUR_MENU+2+((Menu_Taille_couleur-12)<<3))*Menu_Facteur_X,
Menu_Ordonnee_Texte,Menu_Facteur_X*96,Menu_Facteur_Y<<3,CM_Clair);
Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-strlen(Principal_Nom_fichier))<<3);
Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-Taille_nom)<<3);
Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Principal_Nom_fichier,CM_Noir,CM_Clair);
Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Nom_affiche,CM_Noir,CM_Clair);
}
}
@ -4727,12 +4751,12 @@ void Degrade_de_trames_simples(long Indice,short Pos_X,short Pos_Y)
// dans cette procédure par "Position_dans_degrade", on calcule la position
// de l'indice dans le schéma suivant:
//
// Ú Les indices qui traŒnent de ce c“té du segment se voient subir
// Ú Les indices qui traînent de ce c“té du segment se voient subir
// ³ une incrémentation conditionnelle à leur position dans l'écran.
// v
// ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄúúú ú ú
// ^
// ÀÄ Les indices qui traŒnent de ce c“té du segment se voient subir une
// ÀÄ Les indices qui traînent de ce c“té du segment se voient subir une
// décrémentation conditionnelle à leur position dans l'écran.
// On fait d'abord un premier calcul partiel
@ -4799,12 +4823,12 @@ void Degrade_de_trames_etendues(long Indice,short Pos_X,short Pos_Y)
// dans cette procédure par "Position_dans_degrade", on calcule la position
// de l'indice dans le schéma suivant:
//
// Ú Les indices qui traŒnent de ce c“té du segment se voient subir
// Ú Les indices qui traînent de ce c“té du segment se voient subir
// ³ une incrémentation conditionnelle à leur position dans l'écran.
// v
// ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄúúú ú ú
// ^
// ÀÄ Les indices qui traŒnent de ce c“té du segment se voient subir une
// ÀÄ Les indices qui traînent de ce c“té du segment se voient subir une
// décrémentation conditionnelle à leur position dans l'écran.
// On fait d'abord un premier calcul partiel

View File

@ -38,8 +38,9 @@ void Recadrer_palette(void);
void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond);
void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond);
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond);
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur);
void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond);
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond);
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur);
void Print_dans_menu(char * Chaine, short Position);
void Print_coordonnees(void);
void Print_nom_fichier(void);

13
init.c
View File

@ -140,6 +140,19 @@ void Rechercher_drives(void)
// Renvoie 0 si ok, -1 si problème.
int ActiverLecteur(int NumeroLecteur)
{
// Cas particulier du lecteur ~
if (Drive[NumeroLecteur].Lettre == '~')
{
char * Home = getenv("HOME");
if (! Home)
return -1;
#ifdef __linux__
return chdir(Home);
#else
return ! SetCurrentDirectory(Home);
#endif
}
#ifdef __linux__
char NomLecteur[]=" ";
NomLecteur[0]=Drive[NumeroLecteur].Lettre;

View File

@ -758,7 +758,7 @@ typedef struct
word Hauteur;
byte Filler2[118];
T_Palette Palette;
} T_Header_IMG;
} __attribute__((__packed__)) T_Header_IMG;
// -- Tester si un fichier est au format IMG --------------------------------
void Test_IMG(void)
@ -931,7 +931,7 @@ typedef struct
T_Palette Palette; // Palette RVB 256*3
word Jump; // Taille du saut entre le header et l'image:
// On va s'en servir pour rajouter un commentaire
} T_Header_PKM;
} __attribute__((__packed__)) T_Header_PKM;
// -- Tester si un fichier est au format PKM --------------------------------
void Test_PKM(void)
@ -1357,7 +1357,7 @@ typedef struct
byte Yaspect; // Inutile
short Xscreen;
short Yscreen;
} T_Header_LBM;
} __attribute__((__packed__)) T_Header_LBM;
// -- Tester si un fichier est au format LBM --------------------------------
@ -2118,7 +2118,7 @@ typedef struct
uint32_t YPM;
uint32_t Nb_Clr;
uint32_t Clr_Imprt;
} T_BMP_Header;
} __attribute__((__packed__)) T_BMP_Header;
// -- Tester si un fichier est au format BMP --------------------------------
void Test_BMP(void)
@ -2545,7 +2545,7 @@ typedef struct
byte Resol; // Informations sur la résolution (et autres)
byte Backcol; // Couleur de fond
byte Aspect; // Informations sur l'aspect ratio (et autres)
} T_LSDB; // Logical Screen Descriptor Block
} __attribute__((__packed__)) T_LSDB; // Logical Screen Descriptor Block
typedef struct
{
@ -2555,7 +2555,7 @@ typedef struct
word Hauteur_image; // Hauteur de l'image
byte Indicateur; // Informations diverses sur l'image
byte Nb_bits_pixel; // Nb de bits par pixel
} T_IDB; // Image Descriptor Block
} __attribute__((__packed__)) T_IDB; // Image Descriptor Block
// -- Tester si un fichier est au format GIF --------------------------------
@ -3855,7 +3855,7 @@ typedef struct
{
word Width; // Largeur de l'image
word Height; // Hauteur de l'image
} T_CEL_Header1;
} __attribute__((__packed__)) T_CEL_Header1;
typedef struct
{
@ -3868,7 +3868,7 @@ typedef struct
word Decalage_X; // Decalage en X de l'image
word Decalage_Y; // Decalage en Y de l'image
byte Filler2[16]; // ???
} T_CEL_Header2;
} __attribute__((__packed__)) T_CEL_Header2;
// -- Tester si un fichier est au format CEL --------------------------------
@ -4163,7 +4163,7 @@ typedef struct
byte Octet2;
} Couleur[16];
} Palette[10];
} T_KCF_Header;
} __attribute__((__packed__)) T_KCF_Header;
// -- Tester si un fichier est au format KCF --------------------------------
@ -4419,7 +4419,7 @@ typedef struct
word Hauteur;
byte Filler2;
byte Plans;
} T_SCx_Header;
} __attribute__((__packed__)) T_SCx_Header;
// -- Tester si un fichier est au format SCx --------------------------------
void Test_SCx(void)

View File

@ -79,7 +79,7 @@ void Rafficher_toute_la_chaine(word Pos_X,word Pos_Y,char * Chaine,byte Position
//****************************************************************************
//* Enhanced super scanf deluxe pro plus giga mieux :-) *
//****************************************************************************
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie)
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_affichee,byte Type_saisie)
// Paramètres:
// Pos_X, Pos_Y : Coordonnées de la saisie dans la fenêtre
// Chaine : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
@ -94,13 +94,13 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
byte Taille;
word Touche_lue=0;
byte Touche_autorisee;
byte Taille_affichee;
byte Taille_maxi;
// 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;
Taille_maxi = 255;
else
Taille_affichee = Taille_maxi;
Taille_maxi = Taille_affichee;
byte Offset=0; // Indice du premier caractère affiché
@ -118,6 +118,8 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
Taille=strlen(Chaine);
Position=(Taille<Taille_maxi)? Taille:Taille-1;
if (Position-Offset>Taille_affichee)
Offset=Position-Taille_affichee+1;
// Formatage d'une partie de la chaine (si trop longue pour tenir)
strncpy(Chaine_affichee, Chaine + Offset, Taille_affichee);
Chaine_affichee[Taille_affichee]='\0';
@ -191,10 +193,13 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
goto affichage;
}
break;
case SDLK_BACKSPACE :
case SDLK_BACKSPACE : // Backspace : combinaison de gauche + suppr
if (Position)
{
Supprimer_caractere(Chaine,--Position);
{
Position--;
if (Offset > 0 && (Position == 0 || Position < (Offset + 1)))
Offset--;
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),
@ -242,8 +247,6 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
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++;
}
@ -270,7 +273,7 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
// 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);
// On raffiche la chaine correctement
if (Type_saisie==1)
{
@ -282,7 +285,9 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
Print_dans_fenetre(Pos_X+((Taille_maxi-Taille)<<3),Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND);
}
else
Print_dans_fenetre(Pos_X,Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND);
{
Print_dans_fenetre_limite(Pos_X,Pos_Y,Chaine,Taille_affichee,COULEUR_TEXTE,COULEUR_FOND);
}
return (Touche_lue==SDLK_RETURN);
}

View File

@ -1,5 +1,5 @@
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie);
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_affichee,byte Type_saisie);
// Paramètres:
// Pos_X, Pos_Y : Coordonnées de la saisie dans la fenêtre
// Chaine : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)