Code cleanup: Removed the code related to Save/Load window from buttons.c, transferred it to files.c. Files.h now only exposes this window's function.

Some code related to this window is still in loadsave.c (stuff for preview)


git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@695 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2009-03-26 19:41:33 +00:00
parent 994c1ce713
commit fa71dea18d
12 changed files with 1001 additions and 1058 deletions

911
boutons.c
View File

@ -54,8 +54,6 @@
#define FILENAMESPACE 13
#define Display_Window(x,y) UpdateRect(Fenetre_Pos_X,Fenetre_Pos_Y,(x)*Menu_Facteur_X,(y)*Menu_Facteur_Y);
extern short Old_MX;
extern short Old_MY;
@ -2231,915 +2229,6 @@ void Bouton_Brosse_monochrome(void)
Afficher_curseur();
}
//------------------------ Chargements et sauvegardes ------------------------
void Print_repertoire_courant(void)
//
// Affiche Principal_Repertoire_courant sur 37 caractères
//
{
char Nom_temporaire[TAILLE_MAXI_PATH+1]; // Nom tronqué
int length; // length du répertoire courant
int Indice; // Indice de parcours de la chaine complète
Block(Fenetre_Pos_X+(Menu_Facteur_X*7),Fenetre_Pos_Y+(Menu_Facteur_Y*43),Menu_Facteur_X*37*8,Menu_Facteur_Y<<3,CM_Clair);
length=strlen(Principal_Repertoire_courant);
if (length>TAILLE_MAXI_PATH)
{ // Doh! il va falloir tronquer le répertoire (bouh !)
// On commence par copier bêtement les 3 premiers caractères (e.g. "C:\")
for (Indice=0;Indice<3;Indice++)
Nom_temporaire[Indice]=Principal_Repertoire_courant[Indice];
// On y rajoute 3 petits points:
strcpy(Nom_temporaire+3,"...");
// Ensuite, on cherche un endroit à partir duquel on pourrait loger tout
// le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!)
for (Indice++;Indice<length;Indice++)
if ( (Principal_Repertoire_courant[Indice]==SEPARATEUR_CHEMIN[0]) &&
(length-Indice<=TAILLE_MAXI_PATH-6) )
{
// Ouf: on vient de trouver un endroit dans la chaîne à partir duquel
// on peut faire la copie:
strcpy(Nom_temporaire+6,Principal_Repertoire_courant+Indice);
break;
}
// Enfin, on peut afficher la chaîne tronquée
Print_dans_fenetre(7,43,Nom_temporaire,CM_Noir,CM_Clair);
}
else // Ahhh! La chaîne peut loger tranquillement dans la fenêtre
Print_dans_fenetre(7,43,Principal_Repertoire_courant,CM_Noir,CM_Clair);
UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X*7),Fenetre_Pos_Y+(Menu_Facteur_Y*43),Menu_Facteur_X*37*8,Menu_Facteur_Y<<3);
}
void Print_Nom_fichier_dans_selecteur(void)
//
// Affiche Principal_Nom_fichier dans le Fileselect
//
{
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_limite(13+9*8,90,Principal_Nom_fichier,27,CM_Noir,CM_Clair);
UpdateRect(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);
}
int Type_selectionne; // Utilisé pour mémoriser le type d'entrée choisi
// dans le selecteur de fichier.
void Preparer_et_afficher_liste_fichiers(short Position, short offset,
T_Bouton_scroller * button)
{
button->Nb_elements=Liste_Nb_elements;
button->Position=Position;
Calculer_hauteur_curseur_jauge(button);
Fenetre_Dessiner_jauge(button);
// On efface les anciens noms de fichier:
Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir);
// On affiche les nouveaux:
Afficher_la_liste_des_fichiers(Position,offset);
UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82);
// On récupère le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Position,offset,Principal_Nom_fichier,&Type_selectionne);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
// On affiche le nom du répertoire courant
Print_repertoire_courant();
}
void Relire_liste_fichiers(byte Filtre, short Position, short offset,
T_Bouton_scroller * button)
{
Lire_liste_des_fichiers(Filtre);
Trier_la_liste_des_fichiers();
Preparer_et_afficher_liste_fichiers(Position,offset,button);
}
void On_vient_de_scroller_dans_le_fileselect(T_Bouton_scroller * Scroller_de_fichiers)
{
char Ancien_nom_de_fichier[TAILLE_CHEMIN_FICHIER];
strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier);
// On regarde si la liste a bougé
if (Scroller_de_fichiers->Position!=Principal_File_list_Position)
{
// Si c'est le cas, il faut mettre à jour la jauge
Scroller_de_fichiers->Position=Principal_File_list_Position;
Fenetre_Dessiner_jauge(Scroller_de_fichiers);
}
// On récupére le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
if (strcmp(Ancien_nom_de_fichier,Principal_Nom_fichier))
Nouvelle_preview=1;
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
Afficher_curseur();
}
short Position_fichier_dans_liste(char * fname)
{
Element_de_liste_de_fileselect * Element_courant;
short Indice;
for (Indice=0, Element_courant=Liste_du_fileselect;
((Element_courant!=NULL) && (strcmp(Element_courant->NomComplet,fname)));
Indice++,Element_courant=Element_courant->Suivant);
return (Element_courant!=NULL)?Indice:0;
}
void Placer_barre_de_selection_sur(char * fname)
{
short Indice;
Indice=Position_fichier_dans_liste(fname);
if ((Liste_Nb_elements<=10) || (Indice<5))
{
Principal_File_list_Position=0;
Principal_File_list_Decalage=Indice;
}
else
{
if (Indice>=Liste_Nb_elements-5)
{
Principal_File_list_Position=Liste_Nb_elements-10;
Principal_File_list_Decalage=Indice-Principal_File_list_Position;
}
else
{
Principal_File_list_Position=Indice-4;
Principal_File_list_Decalage=4;
}
}
}
char FFF_Meilleur_nom[TAILLE_CHEMIN_FICHIER];
char * Nom_correspondant_le_mieux_a(char * fname)
{
char * Pointeur_Meilleur_nom;
Element_de_liste_de_fileselect * Element_courant;
byte Lettres_identiques=0;
byte counter;
strcpy(FFF_Meilleur_nom,Principal_Nom_fichier);
Pointeur_Meilleur_nom=NULL;
for (Element_courant=Liste_du_fileselect; Element_courant!=NULL; Element_courant=Element_courant->Suivant)
{
if ( (!Config.Find_file_fast)
|| (Config.Find_file_fast==(Element_courant->Type+1)) )
{
// On compare et si c'est mieux, on stocke dans Meilleur_nom
for (counter=0; fname[counter]!='\0' && tolower(Element_courant->NomComplet[counter])==tolower(fname[counter]); counter++);
if (counter>Lettres_identiques)
{
Lettres_identiques=counter;
strcpy(FFF_Meilleur_nom,Element_courant->NomComplet);
Pointeur_Meilleur_nom=Element_courant->NomComplet;
}
}
}
return Pointeur_Meilleur_nom;
}
byte Bouton_Load_ou_Save(byte load, byte image)
// load=1 => On affiche le menu du bouton LOAD
// load=0 => On affiche le menu du bouton SAVE
{
short Bouton_clicke;
T_Bouton_scroller * Scroller_de_fichiers;
T_Bouton_dropdown * Dropdown_des_formats;
T_Bouton_dropdown * Dropdown_bookmark[4];
short Temp;
int Bidon=0; // Sert à appeler SDL_GetKeyState
byte Charger_ou_sauver_l_image=0;
byte On_a_clicke_sur_OK=0;// Indique si on a clické sur Load ou Save ou sur
//un bouton enclenchant Load ou Save juste après.
Composantes * Palette_initiale; // | Données concernant l'image qui
byte Image_modifiee_initiale; // | sont mémorisées pour pouvoir
short Largeur_image_initiale; // |- être restaurées en sortant,
short Hauteur_image_initiale; // | parce que la preview elle les
byte Back_color_initiale; // | fout en l'air (c'te conne).
char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; // Sert à laisser le nom courant du fichier en cas de sauvegarde
char Repertoire_precedent[TAILLE_CHEMIN_FICHIER]; // Répertoire d'où l'on vient après un CHDIR
char Commentaire_initial[TAILLE_COMMENTAIRE+1];
char Fichier_recherche[TAILLE_CHEMIN_FICHIER]="";
char Nom_fichier_Save[TAILLE_CHEMIN_FICHIER];
char * Fichier_le_plus_ressemblant;
Palette_initiale=(Composantes *)malloc(sizeof(T_Palette));
memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette));
Back_color_initiale=Back_color;
Image_modifiee_initiale=Principal_Image_modifiee;
Largeur_image_initiale=Principal_Largeur_image;
Hauteur_image_initiale=Principal_Hauteur_image;
strcpy(Nom_fichier_initial,Principal_Nom_fichier);
strcpy(Commentaire_initial,Principal_Commentaire);
if (load)
{
if (image)
Ouvrir_fenetre(310,187+FILENAMESPACE,"Load picture");
else
Ouvrir_fenetre(310,187+FILENAMESPACE,"Load brush");
Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Load",0,1,SDLK_RETURN); // 1
}
else
{
if (image)
Ouvrir_fenetre(310,187+FILENAMESPACE,"Save picture");
else
Ouvrir_fenetre(310,187+FILENAMESPACE,"Save brush");
Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Save",0,1,SDLK_RETURN); // 1
if (Principal_Format==0) // Correction du *.*
{
Principal_Format=Principal_Format_fichier;
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
}
if (Principal_Format>NB_FORMATS_SAVE) // Correction d'un format insauvable
{
Principal_Format=FORMAT_PAR_DEFAUT;
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
}
// Affichage du commentaire
if (FormatFichier[Principal_Format-1].Commentaire)
Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair);
}
Fenetre_Definir_bouton_normal(125,139+FILENAMESPACE,51,14,"Cancel",0,1,TOUCHE_ESC); // 2
Fenetre_Definir_bouton_normal(125, 89+FILENAMESPACE,51,14,"Delete",0,1,SDLK_DELETE); // 3
// Cadre autour des formats
Fenetre_Afficher_cadre( 7, 51,104, 35);
// Cadre autour des infos sur le fichier de dessin
Fenetre_Afficher_cadre(116, 51,187, 35);
// Cadre autour de la preview
Fenetre_Afficher_cadre_creux(179,88+FILENAMESPACE,124,84);
// Cadre autour du fileselector
Fenetre_Afficher_cadre_creux( 7,88+FILENAMESPACE,100,84);
Fenetre_Definir_bouton_special(9,90+FILENAMESPACE,96,80); // 4
// Scroller du fileselector
Scroller_de_fichiers = Fenetre_Definir_bouton_scroller(110,89+FILENAMESPACE,82,1,10,0); // 5
// Dropdown pour les formats de fichier
Dropdown_des_formats=
Fenetre_Definir_bouton_dropdown(70,56,36,16,0,
(Principal_Format==0)?"*.*":FormatFichier[Principal_Format-1].Extension,
1,0,1,A_DROITE|A_GAUCHE); // 6
if (load)
Fenetre_Dropdown_choix(Dropdown_des_formats,0,"*.*");
for (Temp=0;Temp<NB_FORMATS_CONNUS;Temp++)
{
if ((load && FormatFichier[Temp].Load) ||
(!load && FormatFichier[Temp].Save))
Fenetre_Dropdown_choix(Dropdown_des_formats,Temp+1,FormatFichier[Temp].Extension);
}
Print_dans_fenetre(12,61,"Format:",CM_Fonce,CM_Clair);
// Texte de commentaire des dessins
Print_dans_fenetre(7,174+FILENAMESPACE,"Txt:",CM_Fonce,CM_Clair);
Fenetre_Definir_bouton_saisie(44,173+FILENAMESPACE,TAILLE_COMMENTAIRE); // 7
// Cadre autour du nom de fichier
//Fenetre_Afficher_cadre_creux( 7,87,296,15);
Print_dans_fenetre(9,90,"Filename:",CM_Fonce,CM_Clair);
// Saisie du nom de fichier
Fenetre_Definir_bouton_saisie(11+9*8,88,27); // 8
Print_dans_fenetre(120,55,"Image size :",CM_Fonce,CM_Clair);
Print_dans_fenetre(120,63,"File size :",CM_Fonce,CM_Clair);
Print_dans_fenetre(120,72,"Format :",CM_Fonce,CM_Clair);
// Selecteur de Lecteur / Volume
Fenetre_Definir_bouton_normal(8,17,117,23,"Select drive",0,1,SDLK_LAST); // 9
// Bookmarks
for (Temp=0;Temp<NB_BOOKMARKS;Temp++)
{
Dropdown_bookmark[Temp]=
Fenetre_Definir_bouton_dropdown(126+(88+1)*(Temp%2),17+(Temp/2)*12,88,11,56,"",0,0,1,A_DROITE); // 10-13
Fenetre_Afficher_sprite_drive(Dropdown_bookmark[Temp]->Pos_X+3,Dropdown_bookmark[Temp]->Pos_Y+2,5);
Afficher_bookmark(Dropdown_bookmark[Temp],Temp);
}
// On prend bien soin de passer dans le répertoire courant (le bon qui faut! Oui madame!)
if (load)
{
chdir(Principal_Repertoire_courant);
Determiner_repertoire_courant();
}
else
{
chdir(Principal_Repertoire_fichier);
Determiner_repertoire_courant();
}
// Affichage des premiers fichiers visibles:
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
if (!load)
{
// On initialise le nom de fichier à celui en cours et non pas celui sous
// la barre de sélection
strcpy(Principal_Nom_fichier,Nom_fichier_initial);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
}
Pixel_de_chargement=Pixel_Chargement_dans_preview;
Nouvelle_preview=1;
Display_Window(310,(187+FILENAMESPACE));
Afficher_curseur();
do
{
Bouton_clicke=Fenetre_Bouton_clicke();
switch (Bouton_clicke)
{
case -1 :
case 0 :
break;
case 1 : // Load ou Save
if(load)
{
// Determine the type
if(Fichier_existe(Principal_Nom_fichier))
{
Type_selectionne = 0;
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
}
else
{
Type_selectionne = 1;
}
}
else
{
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
else Type_selectionne = 0;
}
On_a_clicke_sur_OK=1;
break;
case 2 : // Cancel
break;
case 3 : // Delete
if (Liste_Nb_elements && (*Principal_Nom_fichier!='.') && Type_selectionne!=2)
{
char * Message;
Effacer_curseur();
// On affiche une demande de confirmation
if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires)
{
Message="Delete file ?";
}
else
{
Message="Remove directory ?";
}
if (Demande_de_confirmation(Message))
{
// Si c'est un fichier
if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires)
// On efface le fichier (si on peut)
Temp=(!remove(Principal_Nom_fichier));
else // Si c'est un repertoire
// On efface le repertoire (si on peut)
Temp=(!rmdir(Principal_Nom_fichier));
if (Temp) // Temp indique si l'effacement s'est bien passé
{
// On remonte si c'était le dernier élément de la liste
if (Principal_File_list_Position+Principal_File_list_Decalage==Liste_Nb_elements-1)
{
if (Principal_File_list_Position)
Principal_File_list_Position--;
else
if (Principal_File_list_Decalage)
Principal_File_list_Decalage--;
}
else // Si ce n'était pas le dernier, il faut faire gaffe à ce
{ // que ses copains d'en dessous ne remontent pas trop.
if ( (Principal_File_list_Position)
&& (Principal_File_list_Position+10==Liste_Nb_elements) )
{
Principal_File_list_Position--;
Principal_File_list_Decalage++;
}
}
// On relit les informations
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
// On demande la preview du nouveau fichier sur lequel on se trouve
Nouvelle_preview=1;
}
else
Erreur(0);
// On place la barre de sélection du brouillon au début s'il a le
// même répertoire que l'image principale.
if (!strcmp(Principal_Repertoire_courant,Brouillon_Repertoire_courant))
{
Brouillon_File_list_Position=0;
Brouillon_File_list_Decalage=0;
}
}
}
break;
case 4 : // Zone d'affichage de la liste de fichiers
Effacer_curseur();
Temp=Calculer_decalage_click_dans_fileselector();
if (Temp>=0)
{
if (Temp!=Principal_File_list_Decalage)
{
// On met à jour le décalage
Principal_File_list_Decalage=Temp;
// On récupére le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
// On affiche à nouveau la liste
Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage);
// On vient de changer de nom de fichier, donc on doit s'appreter
// a rafficher une preview
Nouvelle_preview=1;
*Fichier_recherche=0;
}
else
{
// En sauvegarde, si on a double-clické sur un répertoire, il
// faut mettre le nom de fichier au nom du répertoire. Sinon, dans
// certains cas, on risque de sauvegarder avec le nom du fichier
// actuel au lieu de changer de répertoire.
if (Principal_File_list_Position+Principal_File_list_Decalage<Liste_Nb_repertoires)
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
On_a_clicke_sur_OK=1;
Nouvelle_preview=1;
*Fichier_recherche=0;
}
}
Afficher_curseur();
Attendre_fin_de_click();
break;
case 5 : // Scroller de fichiers
Effacer_curseur();
Principal_File_list_Position=Fenetre_Attribut2;
// On récupére le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
// On affiche à nouveau la liste
Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage);
Afficher_curseur();
Nouvelle_preview=1;
*Fichier_recherche=0;
break;
case 6 : // Scroller des formats
Effacer_curseur();
// On met à jour le format de browsing du fileselect:
Principal_Format=Fenetre_Attribut2;
// Comme on change de liste, on se place en début de liste:
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
// Affichage des premiers fichiers visibles:
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
Nouvelle_preview=1;
*Fichier_recherche=0;
break;
case 7 : // Saisie d'un commentaire pour la sauvegarde
if ( (!load) && (FormatFichier[Principal_Format-1].Commentaire) )
{
Readline(46,175+FILENAMESPACE,Principal_Commentaire,32,0);
Afficher_curseur();
}
break;
case 8 : // Saisie du nom de fichier
// Save the filename
strcpy(Nom_fichier_Save, Principal_Nom_fichier);
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.
for(Temp=0,Bidon=0; ((Principal_Nom_fichier[Temp]) && (!Bidon)); Temp++)
if (Principal_Nom_fichier[Temp]=='.')
Bidon=1;
if (!Bidon)
{
if (Principal_Format)
{
if(!Repertoire_existe(Principal_Nom_fichier))
{
strcat(Principal_Nom_fichier,".");
strcat(Principal_Nom_fichier,FormatFichier[Principal_Format-1].Extension);
}
}
else
{
// put default extension
// (but maybe we should browse through all available ones until we find
// something suitable ?)
if(!Repertoire_existe(Principal_Nom_fichier))
{
strcat(Principal_Nom_fichier, ".pkm");
}
}
}
if(load)
{
// Determine the type
if(Fichier_existe(Principal_Nom_fichier))
{
Type_selectionne = 0;
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
}
else
{
Type_selectionne = 1;
}
}
else
{
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
else Type_selectionne = 0;
}
On_a_clicke_sur_OK=1;
}
else
{
// Restore the old filename
strcpy(Principal_Nom_fichier, Nom_fichier_Save);
Print_Nom_fichier_dans_selecteur();
}
Afficher_curseur();
break;
case 9 : // Volume Select
Effacer_curseur();
// Comme on tombe sur un disque qu'on connait pas, on se place en
// début de liste:
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
// Affichage des premiers fichiers visibles:
Lire_liste_des_lecteurs();
Trier_la_liste_des_fichiers();
Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
Nouvelle_preview=1;
*Fichier_recherche=0;
break;
default:
if (Bouton_clicke>=10 && Bouton_clicke<10+NB_BOOKMARKS)
{
// Bookmark
char * Nom_repertoire;
switch(Fenetre_Attribut2)
{
case -1: // bouton lui-même: aller au répertoire mémorisé
if (Config.Bookmark_directory[Bouton_clicke-10])
{
*Fichier_recherche=0;
strcpy(Principal_Nom_fichier,Config.Bookmark_directory[Bouton_clicke-10]);
Type_selectionne=1;
On_a_clicke_sur_OK=1;
*Fichier_recherche=0;
}
break;
case 0: // Set
if (Config.Bookmark_directory[Bouton_clicke-10])
free(Config.Bookmark_directory[Bouton_clicke-10]);
Config.Bookmark_label[Bouton_clicke-10][0]='\0';
Temp=strlen(Principal_Repertoire_courant);
Config.Bookmark_directory[Bouton_clicke-10]=malloc(Temp+1);
strcpy(Config.Bookmark_directory[Bouton_clicke-10],Principal_Repertoire_courant);
Nom_repertoire=Position_dernier_slash(Principal_Repertoire_courant);
if (Nom_repertoire && Nom_repertoire[1]!='\0')
Nom_repertoire++;
else
Nom_repertoire=Principal_Repertoire_courant;
Temp=strlen(Nom_repertoire);
strncpy(Config.Bookmark_label[Bouton_clicke-10],Nom_repertoire,8);
if (Temp>8)
{
Config.Bookmark_label[Bouton_clicke-10][7]=CARACTERE_SUSPENSION;
Config.Bookmark_label[Bouton_clicke-10][8]='\0';
}
Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10);
break;
case 1: // Rename
if (Config.Bookmark_directory[Bouton_clicke-10])
{
// On enlève les "..." avant l'édition
char bookmark_label[8+1];
strcpy(bookmark_label, Config.Bookmark_label[Bouton_clicke-10]);
if (bookmark_label[7]==CARACTERE_SUSPENSION)
bookmark_label[7]='\0';
if (Readline_ex(Dropdown_bookmark[Bouton_clicke-10]->Pos_X+3+10,Dropdown_bookmark[Bouton_clicke-10]->Pos_Y+2,bookmark_label,8,8,0))
strcpy(Config.Bookmark_label[Bouton_clicke-10],bookmark_label);
Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10);
Afficher_curseur();
}
break;
case 2: // Clear
if (Config.Bookmark_directory[Bouton_clicke-10] && Demande_de_confirmation("Erase bookmark ?"))
{
free(Config.Bookmark_directory[Bouton_clicke-10]);
Config.Bookmark_directory[Bouton_clicke-10]=NULL;
Config.Bookmark_label[Bouton_clicke-10][0]='\0';
Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10);
}
break;
}
}
break;
}
switch (Touche)
{
case SDLK_UNKNOWN : break;
case SDLK_DOWN : // Bas
*Fichier_recherche=0;
Effacer_curseur();
Select_Scroll_Down(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_UP : // Haut
*Fichier_recherche=0;
Effacer_curseur();
Select_Scroll_Up(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_PAGEDOWN : // PageDown
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,9);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_PAGEUP : // PageUp
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,9);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_END : // End
*Fichier_recherche=0;
Effacer_curseur();
Select_End(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_HOME : // Home
*Fichier_recherche=0;
Effacer_curseur();
Select_Home(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case TOUCHE_MOUSEWHEELDOWN :
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,3);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case TOUCHE_MOUSEWHEELUP :
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,3);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_BACKSPACE : // Backspace
*Fichier_recherche=0;
// Si le choix ".." est bien en tête des propositions...
if (!strcmp(Liste_du_fileselect->NomComplet,PARENT_DIR))
{
// On va dans le répertoire parent.
strcpy(Principal_Nom_fichier,PARENT_DIR);
Type_selectionne=1;
On_a_clicke_sur_OK=1;
}
Touche=0;
break;
default: // Autre => On se place sur le nom de fichier qui correspond
if (Bouton_clicke<=0)
{
if (Est_Raccourci(Touche,0x100+BOUTON_AIDE))
{
Fenetre_aide(load?BOUTON_CHARGER:BOUTON_SAUVER, NULL);
break;
}
Temp=strlen(Fichier_recherche);
if (Touche_ANSI>= ' ' && Touche_ANSI < 255 && Temp<50)
{
Fichier_recherche[Temp]=Touche_ANSI;
Fichier_recherche[Temp+1]='\0';
Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche);
if ( (Fichier_le_plus_ressemblant) )
{
Temp=Principal_File_list_Position+Principal_File_list_Decalage;
Effacer_curseur();
Placer_barre_de_selection_sur(Fichier_le_plus_ressemblant);
Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
if (Temp!=Principal_File_list_Position+Principal_File_list_Decalage)
Nouvelle_preview=1;
}
else
*Fichier_recherche=0;
Touche=0;
}
}
else
*Fichier_recherche=0;
}
if (On_a_clicke_sur_OK)
{
// Si c'est un répertoire, on annule "On_a_clicke_sur_OK" et on passe
// dedans.
if (Type_selectionne!=0)
{
Effacer_curseur();
On_a_clicke_sur_OK=0;
// On mémorise le répertoire dans lequel on était
if (strcmp(Principal_Nom_fichier,PARENT_DIR))
strcpy(Repertoire_precedent,Nom_formate(PARENT_DIR, 1));
else
{
strcpy(Repertoire_precedent,
Nom_formate(Position_dernier_slash(Principal_Repertoire_courant), 1)
);
}
// On doit rentrer dans le répertoire:
if (!chdir(Principal_Nom_fichier))
{
Determiner_repertoire_courant();
// On lit le nouveau répertoire
Lire_liste_des_fichiers(Principal_Format);
Trier_la_liste_des_fichiers();
// On place la barre de sélection sur le répertoire d'où l'on vient
Placer_barre_de_selection_sur(Repertoire_precedent);
}
else
Erreur(0);
// Affichage des premiers fichiers visibles:
Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
Nouvelle_preview=1;
}
else // Sinon on essaye de charger ou sauver le fichier
{
strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant);
if (!load)
Principal_Format_fichier=Principal_Format;
Charger_ou_sauver_l_image=1;
}
}
// Gestion du chrono et des previews
if (Nouvelle_preview)
{
// On efface les infos de la preview précédente s'il y en a une
// d'affichée
if (Etat_chrono==2)
{
Effacer_curseur();
// On efface le commentaire précédent
Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y,
Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair);
// On nettoie la zone où va s'afficher la preview:
Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ (89+FILENAMESPACE)*Menu_Facteur_Y,
Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair);
// On efface les dimensions de l'image
Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y,
Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair);
// On efface la taille du fichier
Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y,
Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair);
// On efface le format du fichier
Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 72*Menu_Facteur_Y,
Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair);
// Affichage du commentaire
if ( (!load) && (FormatFichier[Principal_Format-1].Commentaire) )
{
Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair);
}
Afficher_curseur();
// Un update pour couvrir les 4 zones: 3 libellés plus la zone de preview
UpdateRect(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+55*Menu_Facteur_Y,Menu_Facteur_X*122,Menu_Facteur_Y*(116+FILENAMESPACE));
// Zone de commentaire
UpdateRect(Fenetre_Pos_X+46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y,Menu_Facteur_X*32*8,Menu_Facteur_Y*8);
}
Nouvelle_preview=0;
Etat_chrono=0; // Etat du chrono = Attente d'un Xème de seconde
// On lit le temps de départ du chrono
Initialiser_chrono(Config.Chrono_delay);
}
if (!Etat_chrono) // Prendre une nouvelle mesure du chrono et regarder
Tester_chrono(); // s'il ne faut pas afficher la preview
if (Etat_chrono==1) // Il faut afficher la preview
{
if ( (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) && (Liste_Nb_elements) )
{
strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant);
Effacer_curseur();
Charger_image(image);
UpdateRect(ToWinX(179),ToWinY(88+FILENAMESPACE),ToWinL(124),ToWinH(84));
Afficher_curseur();
// Après le chargement de la preview, on restaure tout ce qui aurait
// pu être modifié par le chargement de l'image:
memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette));
Principal_Image_modifiee=Image_modifiee_initiale;
Principal_Largeur_image=Largeur_image_initiale;
Principal_Hauteur_image=Hauteur_image_initiale;
}
Etat_chrono=2; // On arrête le chrono
}
}
while ( (!On_a_clicke_sur_OK) && (Bouton_clicke!=2) );
// Si on annule, on restaure l'ancien commentaire
if (Bouton_clicke==2)
strcpy(Principal_Commentaire,Commentaire_initial);
// On restaure les données de l'image qui ont certainement été modifiées
// par la preview.
memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette));
Set_palette(Principal_Palette);
Back_color=Back_color_initiale;
Principal_Image_modifiee=Image_modifiee_initiale;
Principal_Largeur_image=Largeur_image_initiale;
Principal_Hauteur_image=Hauteur_image_initiale;
Set_palette(Principal_Palette);
Calculer_couleurs_menu_optimales(Principal_Palette);
Temp=(Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y)<Menu_Ordonnee_avant_fenetre);
Fermer_fenetre();
if (Temp)
Afficher_menu();
Desenclencher_bouton((load)?BOUTON_CHARGER:BOUTON_SAUVER);
Afficher_curseur();
Detruire_liste_du_fileselect();
Pixel_de_chargement=Pixel_Chargement_dans_ecran_courant;
free(Palette_initiale);
return Charger_ou_sauver_l_image;
}
// -- Fonction renvoyant le mode vidéo le plus adapté à l'image chargée -----
#define TOLERANCE_X 8
#define TOLERANCE_Y 4

937
files.c
View File

@ -49,9 +49,13 @@
#include "erreurs.h"
#include "io.h"
#include "windows.h"
#include "sdlscreen.h"
#include "loadsave.h"
#include "mountlist.h"
#include "moteur.h"
#include "readline.h"
#include "input.h"
#include "aide.h"
#define COULEUR_FICHIER_NORMAL CM_Clair // Couleur du texte pour une ligne de fichier non sélectionné
#define COULEUR_REPERTOIRE_NORMAL CM_Fonce // Couleur du texte pour une ligne de répertoire non sélectionné
@ -62,15 +66,6 @@
#define FILENAMESPACE 13
int Determiner_repertoire_courant(void)
// Modifie Principal_Repertoire_courant en y mettant sa nouvelle valeur (avec le nom du
// disque)
//
// Renvoie 1 s'il y a eu une erreur d'accès
{
return (getcwd(Principal_Repertoire_courant,256)==NULL);
}
// Conventions:
//
// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir
@ -350,9 +345,9 @@ void Lire_liste_des_lecteurs(void)
TypeLecteur=LECTEUR_NETWORK;
break;
}
NomLecteur[0]='A'+IndiceBit;
Ajouter_element_a_la_liste(NomLecteur,2);
Liste_Nb_repertoires++;
NomLecteur[0]='A'+IndiceBit;
Ajouter_element_a_la_liste(NomLecteur,2);
Liste_Nb_repertoires++;
IndiceLecteur++;
}
}
@ -741,28 +736,910 @@ void Afficher_bookmark(T_Bouton_dropdown * Bouton, int Numero_bookmark)
}
}
//------------------------ Chargements et sauvegardes ------------------------
void for_each_file(const char * Nom_repertoire, void Callback(const char *))
void Print_repertoire_courant(void)
//
// Affiche Principal_Repertoire_courant sur 37 caractères
//
{
// Pour scan de répertoire
DIR* Repertoire_Courant; //Répertoire courant
struct dirent* entry; // Structure de lecture des éléments
char Nom_fichier_complet[TAILLE_CHEMIN_FICHIER];
int Position_nom_fichier;
strcpy(Nom_fichier_complet, Nom_repertoire);
Repertoire_Courant=opendir(Nom_repertoire);
if(Repertoire_Courant == NULL) return; // Répertoire invalide ...
strcat(Nom_fichier_complet, SEPARATEUR_CHEMIN);
Position_nom_fichier = strlen(Nom_fichier_complet);
while ((entry=readdir(Repertoire_Courant)))
char Nom_temporaire[TAILLE_MAXI_PATH+1]; // Nom tronqué
int length; // length du répertoire courant
int Indice; // Indice de parcours de la chaine complète
Block(Fenetre_Pos_X+(Menu_Facteur_X*7),Fenetre_Pos_Y+(Menu_Facteur_Y*43),Menu_Facteur_X*37*8,Menu_Facteur_Y<<3,CM_Clair);
length=strlen(Principal_Repertoire_courant);
if (length>TAILLE_MAXI_PATH)
{ // Doh! il va falloir tronquer le répertoire (bouh !)
// On commence par copier bêtement les 3 premiers caractères (e.g. "C:\")
for (Indice=0;Indice<3;Indice++)
Nom_temporaire[Indice]=Principal_Repertoire_courant[Indice];
// On y rajoute 3 petits points:
strcpy(Nom_temporaire+3,"...");
// Ensuite, on cherche un endroit à partir duquel on pourrait loger tout
// le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!)
for (Indice++;Indice<length;Indice++)
if ( (Principal_Repertoire_courant[Indice]==SEPARATEUR_CHEMIN[0]) &&
(length-Indice<=TAILLE_MAXI_PATH-6) )
{
// Ouf: on vient de trouver un endroit dans la chaîne à partir duquel
// on peut faire la copie:
strcpy(Nom_temporaire+6,Principal_Repertoire_courant+Indice);
break;
}
// Enfin, on peut afficher la chaîne tronquée
Print_dans_fenetre(7,43,Nom_temporaire,CM_Noir,CM_Clair);
}
else // Ahhh! La chaîne peut loger tranquillement dans la fenêtre
Print_dans_fenetre(7,43,Principal_Repertoire_courant,CM_Noir,CM_Clair);
UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X*7),Fenetre_Pos_Y+(Menu_Facteur_Y*43),Menu_Facteur_X*37*8,Menu_Facteur_Y<<3);
}
void Print_Nom_fichier_dans_selecteur(void)
//
// Affiche Principal_Nom_fichier dans le Fileselect
//
{
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_limite(13+9*8,90,Principal_Nom_fichier,27,CM_Noir,CM_Clair);
UpdateRect(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);
}
int Type_selectionne; // Utilisé pour mémoriser le type d'entrée choisi
// dans le selecteur de fichier.
void Preparer_et_afficher_liste_fichiers(short Position, short offset,
T_Bouton_scroller * button)
{
button->Nb_elements=Liste_Nb_elements;
button->Position=Position;
Calculer_hauteur_curseur_jauge(button);
Fenetre_Dessiner_jauge(button);
// On efface les anciens noms de fichier:
Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir);
// On affiche les nouveaux:
Afficher_la_liste_des_fichiers(Position,offset);
UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82);
// On récupère le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Position,offset,Principal_Nom_fichier,&Type_selectionne);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
// On affiche le nom du répertoire courant
Print_repertoire_courant();
}
void Relire_liste_fichiers(byte Filtre, short Position, short offset,
T_Bouton_scroller * button)
{
Lire_liste_des_fichiers(Filtre);
Trier_la_liste_des_fichiers();
Preparer_et_afficher_liste_fichiers(Position,offset,button);
}
void On_vient_de_scroller_dans_le_fileselect(T_Bouton_scroller * Scroller_de_fichiers)
{
char Ancien_nom_de_fichier[TAILLE_CHEMIN_FICHIER];
strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier);
// On regarde si la liste a bougé
if (Scroller_de_fichiers->Position!=Principal_File_list_Position)
{
struct stat Infos_enreg;
strcpy(&Nom_fichier_complet[Position_nom_fichier], entry->d_name);
stat(Nom_fichier_complet,&Infos_enreg);
if (S_ISREG(Infos_enreg.st_mode))
// Si c'est le cas, il faut mettre à jour la jauge
Scroller_de_fichiers->Position=Principal_File_list_Position;
Fenetre_Dessiner_jauge(Scroller_de_fichiers);
}
// On récupére le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
if (strcmp(Ancien_nom_de_fichier,Principal_Nom_fichier))
Nouvelle_preview=1;
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
Afficher_curseur();
}
short Position_fichier_dans_liste(char * fname)
{
Element_de_liste_de_fileselect * Element_courant;
short Indice;
for (Indice=0, Element_courant=Liste_du_fileselect;
((Element_courant!=NULL) && (strcmp(Element_courant->NomComplet,fname)));
Indice++,Element_courant=Element_courant->Suivant);
return (Element_courant!=NULL)?Indice:0;
}
void Placer_barre_de_selection_sur(char * fname)
{
short Indice;
Indice=Position_fichier_dans_liste(fname);
if ((Liste_Nb_elements<=10) || (Indice<5))
{
Principal_File_list_Position=0;
Principal_File_list_Decalage=Indice;
}
else
{
if (Indice>=Liste_Nb_elements-5)
{
Callback(Nom_fichier_complet);
Principal_File_list_Position=Liste_Nb_elements-10;
Principal_File_list_Decalage=Indice-Principal_File_list_Position;
}
else
{
Principal_File_list_Position=Indice-4;
Principal_File_list_Decalage=4;
}
}
closedir(Repertoire_Courant);
}
char FFF_Meilleur_nom[TAILLE_CHEMIN_FICHIER];
char * Nom_correspondant_le_mieux_a(char * fname)
{
char * Pointeur_Meilleur_nom;
Element_de_liste_de_fileselect * Element_courant;
byte Lettres_identiques=0;
byte counter;
strcpy(FFF_Meilleur_nom,Principal_Nom_fichier);
Pointeur_Meilleur_nom=NULL;
for (Element_courant=Liste_du_fileselect; Element_courant!=NULL; Element_courant=Element_courant->Suivant)
{
if ( (!Config.Find_file_fast)
|| (Config.Find_file_fast==(Element_courant->Type+1)) )
{
// On compare et si c'est mieux, on stocke dans Meilleur_nom
for (counter=0; fname[counter]!='\0' && tolower(Element_courant->NomComplet[counter])==tolower(fname[counter]); counter++);
if (counter>Lettres_identiques)
{
Lettres_identiques=counter;
strcpy(FFF_Meilleur_nom,Element_courant->NomComplet);
Pointeur_Meilleur_nom=Element_courant->NomComplet;
}
}
}
return Pointeur_Meilleur_nom;
}
byte Bouton_Load_ou_Save(byte load, byte image)
// load=1 => On affiche le menu du bouton LOAD
// load=0 => On affiche le menu du bouton SAVE
{
short Bouton_clicke;
T_Bouton_scroller * Scroller_de_fichiers;
T_Bouton_dropdown * Dropdown_des_formats;
T_Bouton_dropdown * Dropdown_bookmark[4];
short Temp;
int Bidon=0; // Sert à appeler SDL_GetKeyState
byte Charger_ou_sauver_l_image=0;
byte On_a_clicke_sur_OK=0;// Indique si on a clické sur Load ou Save ou sur
//un bouton enclenchant Load ou Save juste après.
Composantes * Palette_initiale; // | Données concernant l'image qui
byte Image_modifiee_initiale; // | sont mémorisées pour pouvoir
short Largeur_image_initiale; // |- être restaurées en sortant,
short Hauteur_image_initiale; // | parce que la preview elle les
byte Back_color_initiale; // | fout en l'air (c'te conne).
char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; // Sert à laisser le nom courant du fichier en cas de sauvegarde
char Repertoire_precedent[TAILLE_CHEMIN_FICHIER]; // Répertoire d'où l'on vient après un CHDIR
char Commentaire_initial[TAILLE_COMMENTAIRE+1];
char Fichier_recherche[TAILLE_CHEMIN_FICHIER]="";
char Nom_fichier_Save[TAILLE_CHEMIN_FICHIER];
char * Fichier_le_plus_ressemblant;
Palette_initiale=(Composantes *)malloc(sizeof(T_Palette));
memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette));
Back_color_initiale=Back_color;
Image_modifiee_initiale=Principal_Image_modifiee;
Largeur_image_initiale=Principal_Largeur_image;
Hauteur_image_initiale=Principal_Hauteur_image;
strcpy(Nom_fichier_initial,Principal_Nom_fichier);
strcpy(Commentaire_initial,Principal_Commentaire);
if (load)
{
if (image)
Ouvrir_fenetre(310,187+FILENAMESPACE,"Load picture");
else
Ouvrir_fenetre(310,187+FILENAMESPACE,"Load brush");
Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Load",0,1,SDLK_RETURN); // 1
}
else
{
if (image)
Ouvrir_fenetre(310,187+FILENAMESPACE,"Save picture");
else
Ouvrir_fenetre(310,187+FILENAMESPACE,"Save brush");
Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Save",0,1,SDLK_RETURN); // 1
if (Principal_Format==0) // Correction du *.*
{
Principal_Format=Principal_Format_fichier;
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
}
if (Principal_Format>NB_FORMATS_SAVE) // Correction d'un format insauvable
{
Principal_Format=FORMAT_PAR_DEFAUT;
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
}
// Affichage du commentaire
if (FormatFichier[Principal_Format-1].Commentaire)
Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair);
}
Fenetre_Definir_bouton_normal(125,139+FILENAMESPACE,51,14,"Cancel",0,1,TOUCHE_ESC); // 2
Fenetre_Definir_bouton_normal(125, 89+FILENAMESPACE,51,14,"Delete",0,1,SDLK_DELETE); // 3
// Cadre autour des formats
Fenetre_Afficher_cadre( 7, 51,104, 35);
// Cadre autour des infos sur le fichier de dessin
Fenetre_Afficher_cadre(116, 51,187, 35);
// Cadre autour de la preview
Fenetre_Afficher_cadre_creux(179,88+FILENAMESPACE,124,84);
// Cadre autour du fileselector
Fenetre_Afficher_cadre_creux( 7,88+FILENAMESPACE,100,84);
Fenetre_Definir_bouton_special(9,90+FILENAMESPACE,96,80); // 4
// Scroller du fileselector
Scroller_de_fichiers = Fenetre_Definir_bouton_scroller(110,89+FILENAMESPACE,82,1,10,0); // 5
// Dropdown pour les formats de fichier
Dropdown_des_formats=
Fenetre_Definir_bouton_dropdown(70,56,36,16,0,
(Principal_Format==0)?"*.*":FormatFichier[Principal_Format-1].Extension,
1,0,1,A_DROITE|A_GAUCHE); // 6
if (load)
Fenetre_Dropdown_choix(Dropdown_des_formats,0,"*.*");
for (Temp=0;Temp<NB_FORMATS_CONNUS;Temp++)
{
if ((load && FormatFichier[Temp].Load) ||
(!load && FormatFichier[Temp].Save))
Fenetre_Dropdown_choix(Dropdown_des_formats,Temp+1,FormatFichier[Temp].Extension);
}
Print_dans_fenetre(12,61,"Format:",CM_Fonce,CM_Clair);
// Texte de commentaire des dessins
Print_dans_fenetre(7,174+FILENAMESPACE,"Txt:",CM_Fonce,CM_Clair);
Fenetre_Definir_bouton_saisie(44,173+FILENAMESPACE,TAILLE_COMMENTAIRE); // 7
// Cadre autour du nom de fichier
//Fenetre_Afficher_cadre_creux( 7,87,296,15);
Print_dans_fenetre(9,90,"Filename:",CM_Fonce,CM_Clair);
// Saisie du nom de fichier
Fenetre_Definir_bouton_saisie(11+9*8,88,27); // 8
Print_dans_fenetre(120,55,"Image size :",CM_Fonce,CM_Clair);
Print_dans_fenetre(120,63,"File size :",CM_Fonce,CM_Clair);
Print_dans_fenetre(120,72,"Format :",CM_Fonce,CM_Clair);
// Selecteur de Lecteur / Volume
Fenetre_Definir_bouton_normal(8,17,117,23,"Select drive",0,1,SDLK_LAST); // 9
// Bookmarks
for (Temp=0;Temp<NB_BOOKMARKS;Temp++)
{
Dropdown_bookmark[Temp]=
Fenetre_Definir_bouton_dropdown(126+(88+1)*(Temp%2),17+(Temp/2)*12,88,11,56,"",0,0,1,A_DROITE); // 10-13
Fenetre_Afficher_sprite_drive(Dropdown_bookmark[Temp]->Pos_X+3,Dropdown_bookmark[Temp]->Pos_Y+2,5);
Afficher_bookmark(Dropdown_bookmark[Temp],Temp);
}
// On prend bien soin de passer dans le répertoire courant (le bon qui faut! Oui madame!)
if (load)
{
chdir(Principal_Repertoire_courant);
getcwd(Principal_Repertoire_courant,256);
}
else
{
chdir(Principal_Repertoire_fichier);
getcwd(Principal_Repertoire_courant,256);
}
// Affichage des premiers fichiers visibles:
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
if (!load)
{
// On initialise le nom de fichier à celui en cours et non pas celui sous
// la barre de sélection
strcpy(Principal_Nom_fichier,Nom_fichier_initial);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
}
Pixel_de_chargement=Pixel_Chargement_dans_preview;
Nouvelle_preview=1;
Display_Window(310,(187+FILENAMESPACE));
Afficher_curseur();
do
{
Bouton_clicke=Fenetre_Bouton_clicke();
switch (Bouton_clicke)
{
case -1 :
case 0 :
break;
case 1 : // Load ou Save
if(load)
{
// Determine the type
if(Fichier_existe(Principal_Nom_fichier))
{
Type_selectionne = 0;
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
}
else
{
Type_selectionne = 1;
}
}
else
{
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
else Type_selectionne = 0;
}
On_a_clicke_sur_OK=1;
break;
case 2 : // Cancel
break;
case 3 : // Delete
if (Liste_Nb_elements && (*Principal_Nom_fichier!='.') && Type_selectionne!=2)
{
char * Message;
Effacer_curseur();
// On affiche une demande de confirmation
if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires)
{
Message="Delete file ?";
}
else
{
Message="Remove directory ?";
}
if (Demande_de_confirmation(Message))
{
// Si c'est un fichier
if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires)
// On efface le fichier (si on peut)
Temp=(!remove(Principal_Nom_fichier));
else // Si c'est un repertoire
// On efface le repertoire (si on peut)
Temp=(!rmdir(Principal_Nom_fichier));
if (Temp) // Temp indique si l'effacement s'est bien passé
{
// On remonte si c'était le dernier élément de la liste
if (Principal_File_list_Position+Principal_File_list_Decalage==Liste_Nb_elements-1)
{
if (Principal_File_list_Position)
Principal_File_list_Position--;
else
if (Principal_File_list_Decalage)
Principal_File_list_Decalage--;
}
else // Si ce n'était pas le dernier, il faut faire gaffe à ce
{ // que ses copains d'en dessous ne remontent pas trop.
if ( (Principal_File_list_Position)
&& (Principal_File_list_Position+10==Liste_Nb_elements) )
{
Principal_File_list_Position--;
Principal_File_list_Decalage++;
}
}
// On relit les informations
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
// On demande la preview du nouveau fichier sur lequel on se trouve
Nouvelle_preview=1;
}
else
Erreur(0);
// On place la barre de sélection du brouillon au début s'il a le
// même répertoire que l'image principale.
if (!strcmp(Principal_Repertoire_courant,Brouillon_Repertoire_courant))
{
Brouillon_File_list_Position=0;
Brouillon_File_list_Decalage=0;
}
}
}
break;
case 4 : // Zone d'affichage de la liste de fichiers
Effacer_curseur();
Temp=Calculer_decalage_click_dans_fileselector();
if (Temp>=0)
{
if (Temp!=Principal_File_list_Decalage)
{
// On met à jour le décalage
Principal_File_list_Decalage=Temp;
// On récupére le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
// On affiche à nouveau la liste
Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage);
// On vient de changer de nom de fichier, donc on doit s'appreter
// a rafficher une preview
Nouvelle_preview=1;
*Fichier_recherche=0;
}
else
{
// En sauvegarde, si on a double-clické sur un répertoire, il
// faut mettre le nom de fichier au nom du répertoire. Sinon, dans
// certains cas, on risque de sauvegarder avec le nom du fichier
// actuel au lieu de changer de répertoire.
if (Principal_File_list_Position+Principal_File_list_Decalage<Liste_Nb_repertoires)
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
On_a_clicke_sur_OK=1;
Nouvelle_preview=1;
*Fichier_recherche=0;
}
}
Afficher_curseur();
Attendre_fin_de_click();
break;
case 5 : // Scroller de fichiers
Effacer_curseur();
Principal_File_list_Position=Fenetre_Attribut2;
// On récupére le nom du schmilblick à "accéder"
Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne);
// On affiche le nouveau nom de fichier
Print_Nom_fichier_dans_selecteur();
// On affiche à nouveau la liste
Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage);
Afficher_curseur();
Nouvelle_preview=1;
*Fichier_recherche=0;
break;
case 6 : // Scroller des formats
Effacer_curseur();
// On met à jour le format de browsing du fileselect:
Principal_Format=Fenetre_Attribut2;
// Comme on change de liste, on se place en début de liste:
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
// Affichage des premiers fichiers visibles:
Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
Nouvelle_preview=1;
*Fichier_recherche=0;
break;
case 7 : // Saisie d'un commentaire pour la sauvegarde
if ( (!load) && (FormatFichier[Principal_Format-1].Commentaire) )
{
Readline(46,175+FILENAMESPACE,Principal_Commentaire,32,0);
Afficher_curseur();
}
break;
case 8 : // Saisie du nom de fichier
// Save the filename
strcpy(Nom_fichier_Save, Principal_Nom_fichier);
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.
for(Temp=0,Bidon=0; ((Principal_Nom_fichier[Temp]) && (!Bidon)); Temp++)
if (Principal_Nom_fichier[Temp]=='.')
Bidon=1;
if (!Bidon)
{
if (Principal_Format)
{
if(!Repertoire_existe(Principal_Nom_fichier))
{
strcat(Principal_Nom_fichier,".");
strcat(Principal_Nom_fichier,FormatFichier[Principal_Format-1].Extension);
}
}
else
{
// put default extension
// (but maybe we should browse through all available ones until we find
// something suitable ?)
if(!Repertoire_existe(Principal_Nom_fichier))
{
strcat(Principal_Nom_fichier, ".pkm");
}
}
}
if(load)
{
// Determine the type
if(Fichier_existe(Principal_Nom_fichier))
{
Type_selectionne = 0;
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
}
else
{
Type_selectionne = 1;
}
}
else
{
if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1;
else Type_selectionne = 0;
}
On_a_clicke_sur_OK=1;
}
else
{
// Restore the old filename
strcpy(Principal_Nom_fichier, Nom_fichier_Save);
Print_Nom_fichier_dans_selecteur();
}
Afficher_curseur();
break;
case 9 : // Volume Select
Effacer_curseur();
// Comme on tombe sur un disque qu'on connait pas, on se place en
// début de liste:
Principal_File_list_Position=0;
Principal_File_list_Decalage=0;
// Affichage des premiers fichiers visibles:
Lire_liste_des_lecteurs();
Trier_la_liste_des_fichiers();
Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
Nouvelle_preview=1;
*Fichier_recherche=0;
break;
default:
if (Bouton_clicke>=10 && Bouton_clicke<10+NB_BOOKMARKS)
{
// Bookmark
char * Nom_repertoire;
switch(Fenetre_Attribut2)
{
case -1: // bouton lui-même: aller au répertoire mémorisé
if (Config.Bookmark_directory[Bouton_clicke-10])
{
*Fichier_recherche=0;
strcpy(Principal_Nom_fichier,Config.Bookmark_directory[Bouton_clicke-10]);
Type_selectionne=1;
On_a_clicke_sur_OK=1;
*Fichier_recherche=0;
}
break;
case 0: // Set
if (Config.Bookmark_directory[Bouton_clicke-10])
free(Config.Bookmark_directory[Bouton_clicke-10]);
Config.Bookmark_label[Bouton_clicke-10][0]='\0';
Temp=strlen(Principal_Repertoire_courant);
Config.Bookmark_directory[Bouton_clicke-10]=malloc(Temp+1);
strcpy(Config.Bookmark_directory[Bouton_clicke-10],Principal_Repertoire_courant);
Nom_repertoire=Position_dernier_slash(Principal_Repertoire_courant);
if (Nom_repertoire && Nom_repertoire[1]!='\0')
Nom_repertoire++;
else
Nom_repertoire=Principal_Repertoire_courant;
Temp=strlen(Nom_repertoire);
strncpy(Config.Bookmark_label[Bouton_clicke-10],Nom_repertoire,8);
if (Temp>8)
{
Config.Bookmark_label[Bouton_clicke-10][7]=CARACTERE_SUSPENSION;
Config.Bookmark_label[Bouton_clicke-10][8]='\0';
}
Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10);
break;
case 1: // Rename
if (Config.Bookmark_directory[Bouton_clicke-10])
{
// On enlève les "..." avant l'édition
char bookmark_label[8+1];
strcpy(bookmark_label, Config.Bookmark_label[Bouton_clicke-10]);
if (bookmark_label[7]==CARACTERE_SUSPENSION)
bookmark_label[7]='\0';
if (Readline_ex(Dropdown_bookmark[Bouton_clicke-10]->Pos_X+3+10,Dropdown_bookmark[Bouton_clicke-10]->Pos_Y+2,bookmark_label,8,8,0))
strcpy(Config.Bookmark_label[Bouton_clicke-10],bookmark_label);
Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10);
Afficher_curseur();
}
break;
case 2: // Clear
if (Config.Bookmark_directory[Bouton_clicke-10] && Demande_de_confirmation("Erase bookmark ?"))
{
free(Config.Bookmark_directory[Bouton_clicke-10]);
Config.Bookmark_directory[Bouton_clicke-10]=NULL;
Config.Bookmark_label[Bouton_clicke-10][0]='\0';
Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10);
}
break;
}
}
break;
}
switch (Touche)
{
case SDLK_UNKNOWN : break;
case SDLK_DOWN : // Bas
*Fichier_recherche=0;
Effacer_curseur();
Select_Scroll_Down(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_UP : // Haut
*Fichier_recherche=0;
Effacer_curseur();
Select_Scroll_Up(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_PAGEDOWN : // PageDown
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,9);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_PAGEUP : // PageUp
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,9);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_END : // End
*Fichier_recherche=0;
Effacer_curseur();
Select_End(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_HOME : // Home
*Fichier_recherche=0;
Effacer_curseur();
Select_Home(&Principal_File_list_Position,&Principal_File_list_Decalage);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case TOUCHE_MOUSEWHEELDOWN :
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,3);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case TOUCHE_MOUSEWHEELUP :
*Fichier_recherche=0;
Effacer_curseur();
Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,3);
On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers);
Touche=0;
break;
case SDLK_BACKSPACE : // Backspace
*Fichier_recherche=0;
// Si le choix ".." est bien en tête des propositions...
if (!strcmp(Liste_du_fileselect->NomComplet,PARENT_DIR))
{
// On va dans le répertoire parent.
strcpy(Principal_Nom_fichier,PARENT_DIR);
Type_selectionne=1;
On_a_clicke_sur_OK=1;
}
Touche=0;
break;
default: // Autre => On se place sur le nom de fichier qui correspond
if (Bouton_clicke<=0)
{
if (Est_Raccourci(Touche,0x100+BOUTON_AIDE))
{
Fenetre_aide(load?BOUTON_CHARGER:BOUTON_SAUVER, NULL);
break;
}
Temp=strlen(Fichier_recherche);
if (Touche_ANSI>= ' ' && Touche_ANSI < 255 && Temp<50)
{
Fichier_recherche[Temp]=Touche_ANSI;
Fichier_recherche[Temp+1]='\0';
Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche);
if ( (Fichier_le_plus_ressemblant) )
{
Temp=Principal_File_list_Position+Principal_File_list_Decalage;
Effacer_curseur();
Placer_barre_de_selection_sur(Fichier_le_plus_ressemblant);
Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
if (Temp!=Principal_File_list_Position+Principal_File_list_Decalage)
Nouvelle_preview=1;
}
else
*Fichier_recherche=0;
Touche=0;
}
}
else
*Fichier_recherche=0;
}
if (On_a_clicke_sur_OK)
{
// Si c'est un répertoire, on annule "On_a_clicke_sur_OK" et on passe
// dedans.
if (Type_selectionne!=0)
{
Effacer_curseur();
On_a_clicke_sur_OK=0;
// On mémorise le répertoire dans lequel on était
if (strcmp(Principal_Nom_fichier,PARENT_DIR))
strcpy(Repertoire_precedent,Nom_formate(PARENT_DIR, 1));
else
{
strcpy(Repertoire_precedent,
Nom_formate(Position_dernier_slash(Principal_Repertoire_courant), 1)
);
}
// On doit rentrer dans le répertoire:
if (!chdir(Principal_Nom_fichier))
{
getcwd(Principal_Repertoire_courant,256);
// On lit le nouveau répertoire
Lire_liste_des_fichiers(Principal_Format);
Trier_la_liste_des_fichiers();
// On place la barre de sélection sur le répertoire d'où l'on vient
Placer_barre_de_selection_sur(Repertoire_precedent);
}
else
Erreur(0);
// Affichage des premiers fichiers visibles:
Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers);
Afficher_curseur();
Nouvelle_preview=1;
}
else // Sinon on essaye de charger ou sauver le fichier
{
strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant);
if (!load)
Principal_Format_fichier=Principal_Format;
Charger_ou_sauver_l_image=1;
}
}
// Gestion du chrono et des previews
if (Nouvelle_preview)
{
// On efface les infos de la preview précédente s'il y en a une
// d'affichée
if (Etat_chrono==2)
{
Effacer_curseur();
// On efface le commentaire précédent
Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y,
Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair);
// On nettoie la zone où va s'afficher la preview:
Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ (89+FILENAMESPACE)*Menu_Facteur_Y,
Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair);
// On efface les dimensions de l'image
Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y,
Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair);
// On efface la taille du fichier
Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y,
Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair);
// On efface le format du fichier
Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 72*Menu_Facteur_Y,
Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair);
// Affichage du commentaire
if ( (!load) && (FormatFichier[Principal_Format-1].Commentaire) )
{
Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair);
}
Afficher_curseur();
// Un update pour couvrir les 4 zones: 3 libellés plus la zone de preview
UpdateRect(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+55*Menu_Facteur_Y,Menu_Facteur_X*122,Menu_Facteur_Y*(116+FILENAMESPACE));
// Zone de commentaire
UpdateRect(Fenetre_Pos_X+46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y,Menu_Facteur_X*32*8,Menu_Facteur_Y*8);
}
Nouvelle_preview=0;
Etat_chrono=0; // Etat du chrono = Attente d'un Xème de seconde
// On lit le temps de départ du chrono
Initialiser_chrono(Config.Chrono_delay);
}
if (!Etat_chrono) // Prendre une nouvelle mesure du chrono et regarder
Tester_chrono(); // s'il ne faut pas afficher la preview
if (Etat_chrono==1) // Il faut afficher la preview
{
if ( (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) && (Liste_Nb_elements) )
{
strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant);
Effacer_curseur();
Charger_image(image);
UpdateRect(ToWinX(179),ToWinY(88+FILENAMESPACE),ToWinL(124),ToWinH(84));
Afficher_curseur();
// Après le chargement de la preview, on restaure tout ce qui aurait
// pu être modifié par le chargement de l'image:
memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette));
Principal_Image_modifiee=Image_modifiee_initiale;
Principal_Largeur_image=Largeur_image_initiale;
Principal_Hauteur_image=Hauteur_image_initiale;
}
Etat_chrono=2; // On arrête le chrono
}
}
while ( (!On_a_clicke_sur_OK) && (Bouton_clicke!=2) );
// Si on annule, on restaure l'ancien commentaire
if (Bouton_clicke==2)
strcpy(Principal_Commentaire,Commentaire_initial);
// On restaure les données de l'image qui ont certainement été modifiées
// par la preview.
memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette));
Set_palette(Principal_Palette);
Back_color=Back_color_initiale;
Principal_Image_modifiee=Image_modifiee_initiale;
Principal_Largeur_image=Largeur_image_initiale;
Principal_Hauteur_image=Hauteur_image_initiale;
Set_palette(Principal_Palette);
Calculer_couleurs_menu_optimales(Principal_Palette);
Temp=(Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y)<Menu_Ordonnee_avant_fenetre);
Fermer_fenetre();
if (Temp)
Afficher_menu();
Desenclencher_bouton((load)?BOUTON_CHARGER:BOUTON_SAUVER);
Afficher_curseur();
Detruire_liste_du_fileselect();
Pixel_de_chargement=Pixel_Chargement_dans_ecran_courant;
free(Palette_initiale);
return Charger_ou_sauver_l_image;
}

35
files.h
View File

@ -18,38 +18,5 @@
write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// Modifie Principal_Repertoire_courant en y mettant sa nouvelle valeur
// (avec le nom du disque)
int Determiner_repertoire_courant(void);
// -- Destruction de la liste chaînée ---------------------------------------
void Detruire_liste_du_fileselect(void);
// -- Lecture d'une liste de fichiers ---------------------------------------
void Lire_liste_des_fichiers(byte Format_demande);
// -- Lecture d'une liste de lecteurs / volumes -----------------------------
void Lire_liste_des_lecteurs(void);
// -- Tri de la liste des fichiers et répertoires ---------------------------
void Trier_la_liste_des_fichiers(void);
// -- Affichage des éléments de la liste de fichier / répertoire ------------
void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select);
// -- Récupérer le libellé d'un élément de la liste -------------------------
void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select,char * label,int *type);
void Afficher_bookmark(T_Bouton_dropdown * Bouton, int Numero_bookmark);
// -- Déplacements dans la liste des fichiers -------------------------------
void Select_Scroll_Down(short * Decalage_premier,short * Decalage_select);
void Select_Scroll_Up (short * Decalage_premier,short * Decalage_select);
void Select_Page_Down (short * Decalage_premier,short * Decalage_select, short lines);
void Select_Page_Up (short * Decalage_premier,short * Decalage_select, short lines);
void Select_End (short * Decalage_premier,short * Decalage_select);
void Select_Home (short * Decalage_premier,short * Decalage_select);
short Calculer_decalage_click_dans_fileselector(void);
char * Nom_formate(char * fname, int type);
// Scans a directory, calls Callback for each file in it,
void for_each_file(const char * Nom_repertoire, void Callback(const char *));
byte Bouton_Load_ou_Save(byte load, byte image);

View File

@ -108,11 +108,6 @@ void Changer_facteur_loupe(byte Indice_facteur);
void Remap_picture(void);
#define ToWinX(x) (((x)*Menu_Facteur_X)+Fenetre_Pos_X)
#define ToWinY(y) (((y)*Menu_Facteur_Y)+Fenetre_Pos_Y)
#define ToWinL(l) ((l)*Menu_Facteur_X)
#define ToWinH(h) ((h)*Menu_Facteur_Y)
// Définition d'une fonction générique de traçage de figures:
fonction_afficheur Pixel_figure;
void Mettre_Ecran_A_Jour(short x, short y, short width, short height);

11
init.c
View File

@ -29,8 +29,6 @@
#endif
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
@ -62,7 +60,6 @@
#include "clavier.h"
#include "io.h"
#include "hotkeys.h"
#include "files.h"
#include "setup.h"
#include "windows.h"
#include "sdlscreen.h"
@ -1665,14 +1662,12 @@ int Charger_CFG(int Tout_charger)
Config_Chunk Chunk;
Config_Infos_touche CFG_Infos_touche;
Config_Mode_video CFG_Mode_video;
struct stat Informations_Fichier;
int Conversion_touches = 0;
strcpy(Nom_du_fichier,Repertoire_de_configuration);
strcat(Nom_du_fichier,"gfx2.cfg");
stat(Nom_du_fichier,&Informations_Fichier);
Taille_fichier=Informations_Fichier.st_size;
Taille_fichier=FileLength(Nom_du_fichier);
if ((Handle=fopen(Nom_du_fichier,"rb"))==NULL)
return ERREUR_CFG_ABSENT;
@ -1954,8 +1949,8 @@ int Sauver_CFG(void)
char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
Config_Header cfg_header;
Config_Chunk Chunk;
Config_Infos_touche CFG_Infos_touche;
Config_Mode_video CFG_Mode_video;
Config_Infos_touche CFG_Infos_touche={0,0,0};
Config_Mode_video CFG_Mode_video={0,0,0};
strcpy(Nom_du_fichier,Repertoire_de_configuration);
strcat(Nom_du_fichier,"gfx2.cfg");

42
io.c
View File

@ -241,3 +241,45 @@ int Repertoire_existe(char * Repertoire)
}
}
}
// Taille de fichier, en octets
int FileLength(const char * fname)
{
struct stat infos_fichier;
if (stat(fname,&infos_fichier))
return 0;
return infos_fichier.st_size;
}
int File_length_file(FILE * file)
{
struct stat infos_fichier;
if (fstat(fileno(file),&infos_fichier))
return 0;
return infos_fichier.st_size;
}
void for_each_file(const char * Nom_repertoire, void Callback(const char *))
{
// Pour scan de répertoire
DIR* Repertoire_Courant; //Répertoire courant
struct dirent* entry; // Structure de lecture des éléments
char Nom_fichier_complet[TAILLE_CHEMIN_FICHIER];
int Position_nom_fichier;
strcpy(Nom_fichier_complet, Nom_repertoire);
Repertoire_Courant=opendir(Nom_repertoire);
if(Repertoire_Courant == NULL) return; // Répertoire invalide ...
strcat(Nom_fichier_complet, SEPARATEUR_CHEMIN);
Position_nom_fichier = strlen(Nom_fichier_complet);
while ((entry=readdir(Repertoire_Courant)))
{
struct stat Infos_enreg;
strcpy(&Nom_fichier_complet[Position_nom_fichier], entry->d_name);
stat(Nom_fichier_complet,&Infos_enreg);
if (S_ISREG(Infos_enreg.st_mode))
{
Callback(Nom_fichier_complet);
}
}
closedir(Repertoire_Courant);
}

9
io.h
View File

@ -49,9 +49,18 @@ char * Position_dernier_slash(const char * Chaine);
#define SEPARATEUR_CHEMIN "/"
#endif
// Taille de fichier, en octets
int FileLength(const char *fname);
// Taille de fichier, en octets
int File_length_file(FILE * file);
// Détermine si un file passé en paramètre existe ou non dans le
// répertoire courant.
int Fichier_existe(char * fname);
// Détermine si un répertoire passé en paramètre existe ou non dans le
// répertoire courant.
int Repertoire_existe(char * Repertoire);
// Scans a directory, calls Callback for each file in it,
void for_each_file(const char * Nom_repertoire, void Callback(const char *));

View File

@ -23,7 +23,6 @@
#define _XOPEN_SOURCE
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -137,14 +136,6 @@ T_Format FormatFichier[NB_FORMATS_CONNUS] = {
// Actuellement seul le format PNG peut donner autre chose que PIXEL_SIMPLE.
enum PIXEL_RATIO Ratio_image_chargee=PIXEL_SIMPLE;
// Taille de fichier, en octets
int FileLength(FILE * file)
{
struct stat infos_fichier;
fstat(fileno(file),&infos_fichier);
return infos_fichier.st_size;
}
// Chargement des pixels dans l'écran principal
void Pixel_Chargement_dans_ecran_courant(word x_pos,word y_pos,byte Couleur)
{
@ -731,7 +722,6 @@ void Test_PAL(void)
FILE *file; // Fichier du fichier
char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
long Taille_du_fichier; // Taille du fichier
struct stat Informations_Fichier;
Nom_fichier_complet(Nom_du_fichier,0);
@ -740,9 +730,8 @@ void Test_PAL(void)
// Ouverture du fichier
if ((file=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
// Lecture de la taille du fichier
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(file);
fclose(file);
// Le fichier ne peut être au format PAL que si sa taille vaut 768 octets
if (Taille_du_fichier==sizeof(T_Palette))
@ -884,17 +873,13 @@ void Load_IMG(void)
long Largeur_lue;
long Taille_du_fichier;
T_Header_IMG IMG_header;
struct stat Informations_Fichier;
stat(Nom_du_fichier,&Informations_Fichier);
Nom_fichier_complet(Nom_du_fichier,0);
Erreur_fichier=0;
if ((file=fopen(Nom_du_fichier, "rb")))
{
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(file);
if (read_bytes(file,&IMG_header,sizeof(T_Header_IMG)))
{
@ -1068,8 +1053,6 @@ void Load_PKM(void)
dword Taille_image;
dword Taille_pack;
long Taille_du_fichier;
struct stat Informations_Fichier;
Nom_fichier_complet(Nom_du_fichier,0);
@ -1077,8 +1060,7 @@ void Load_PKM(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(file);
if (read_bytes(file,&header,sizeof(T_Header_PKM)))
{
@ -1197,7 +1179,7 @@ void Load_PKM(void)
Compteur_de_donnees_packees=0;
Compteur_de_pixels=0;
Taille_pack=(Informations_Fichier.st_size)-sizeof(T_Header_PKM)-header.Jump;
Taille_pack=(Taille_du_fichier)-sizeof(T_Header_PKM)-header.Jump;
// Boucle de décompression:
while ( (Compteur_de_pixels<Taille_image) && (Compteur_de_donnees_packees<Taille_pack) && (!Erreur_fichier) )
@ -1763,7 +1745,6 @@ void Load_LBM(void)
short Vraie_taille_ligne; // Taille d'une ligne en pixels
byte Couleur;
long Taille_du_fichier;
struct stat Informations_Fichier;
dword Dummy;
Nom_fichier_complet(Nom_du_fichier,0);
@ -1772,8 +1753,7 @@ void Load_LBM(void)
if ((LBM_Fichier=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(LBM_Fichier);
// On avance dans le fichier (pas besoin de tester ce qui l'a déjà été)
read_bytes(LBM_Fichier,section,4);
@ -2101,8 +2081,7 @@ void Save_LBM(void)
word y_pos;
byte temp_byte;
word Vraie_largeur;
struct stat Informations_Fichier;
int Taille_fichier;
Erreur_fichier=0;
Nom_fichier_complet(Nom_du_fichier,0);
@ -2174,11 +2153,11 @@ void Save_LBM(void)
if (!Erreur_fichier)
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_fichier=FileLength(Nom_du_fichier);
LBM_Fichier=fopen(Nom_du_fichier,"rb+");
fseek(LBM_Fichier,820,SEEK_SET);
write_dword_be(LBM_Fichier,Informations_Fichier.st_size-824);
write_dword_be(LBM_Fichier,Taille_fichier-824);
if (!Erreur_fichier)
{
@ -2186,16 +2165,16 @@ void Save_LBM(void)
// Si la taille de la section de l'image (taille fichier-8) est
// impaire, on rajoute un 0 (Padding) à la fin.
if ((Informations_Fichier.st_size) & 1)
if ((Taille_fichier) & 1)
{
write_dword_be(LBM_Fichier,Informations_Fichier.st_size-7);
write_dword_be(LBM_Fichier,Taille_fichier-7);
fseek(LBM_Fichier,0,SEEK_END);
temp_byte=0;
if (! write_bytes(LBM_Fichier,&temp_byte,1))
Erreur_fichier=1;
}
else
write_dword_be(LBM_Fichier,Informations_Fichier.st_size-8);
write_dword_be(LBM_Fichier,Taille_fichier-8);
fclose(LBM_Fichier);
@ -2304,8 +2283,6 @@ void Load_BMP(void)
word Taille_ligne;
byte a,b,c=0;
long Taille_du_fichier;
struct stat Informations_Fichier;
Nom_fichier_complet(Nom_du_fichier,0);
@ -2313,8 +2290,7 @@ void Load_BMP(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(file);
if (read_word_le(file,&(header.Signature))
&& read_dword_le(file,&(header.Taille_1))
@ -2848,7 +2824,6 @@ void Load_GIF(void)
word Valeur_Clr; // Valeur <=> Clear tables
word Valeur_Eof; // Valeur <=> Fin d'image
long Taille_du_fichier;
struct stat Informations_Fichier;
int Nombre_LID; // Nombre d'images trouvées dans le fichier
/////////////////////////////////////////////////// FIN DES DECLARATIONS //
@ -2865,9 +2840,7 @@ void Load_GIF(void)
if ((GIF_Fichier=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(GIF_Fichier);
if ( (read_bytes(GIF_Fichier,signature,6)) &&
( (memcmp(signature,"GIF87a",6)==0) ||
(memcmp(signature,"GIF89a",6)==0) ) )
@ -3631,7 +3604,6 @@ void Load_PCX(void)
long position;
long Taille_image;
byte * Buffer;
struct stat Informations_Fichier;
Nom_fichier_complet(Nom_du_fichier,0);
@ -3639,8 +3611,7 @@ void Load_PCX(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(file);
/*
if (read_bytes(file,&PCX_header,sizeof(T_PCX_Header)))
{*/
@ -4086,15 +4057,17 @@ void Test_CEL(void)
FILE *file;
T_CEL_Header1 header1;
T_CEL_Header2 header2;
struct stat Informations_Fichier;
int Taille_fichier;
Erreur_fichier=0;
if (!stat(Nom_du_fichier,&Informations_Fichier))
Nom_fichier_complet(Nom_du_fichier,0);
Taille_fichier=FileLength(Nom_du_fichier);
if (Taille_fichier==0)
{
Erreur_fichier = 1; // Si on ne peut pas faire de stat il vaut mieux laisser tomber
return;
}
Nom_fichier_complet(Nom_du_fichier,0);
if (! (file=fopen(Nom_du_fichier, "rb")))
{
Erreur_fichier = 1;
@ -4106,7 +4079,7 @@ void Test_CEL(void)
// Vu que ce header n'a pas de signature, il va falloir tester la
// cohérence de la dimension de l'image avec celle du fichier.
size=(Informations_Fichier.st_size)-sizeof(T_CEL_Header1);
size=Taille_fichier-sizeof(T_CEL_Header1);
if ( (!size) || ( (((header1.Width+1)>>1)*header1.Height)!=size ) )
{
// Tentative de reconnaissance de la signature des nouveaux fichiers
@ -4152,17 +4125,14 @@ void Load_CEL(void)
short y_pos;
byte Dernier_octet=0;
long Taille_du_fichier;
struct stat Informations_Fichier;
Erreur_fichier=0;
stat(Nom_du_fichier,&Informations_Fichier);
Nom_fichier_complet(Nom_du_fichier,0);
if ((file=fopen(Nom_du_fichier, "rb")))
{
if (read_bytes(file,&header1,sizeof(T_CEL_Header1)))
{
Taille_du_fichier=Informations_Fichier.st_size;
Taille_du_fichier=File_length_file(file);
if ( (Taille_du_fichier>(long int)sizeof(T_CEL_Header1))
&& ( (((header1.Width+1)>>1)*header1.Height)==(Taille_du_fichier-(long int)sizeof(T_CEL_Header1)) ) )
{
@ -4403,7 +4373,7 @@ void Test_KCF(void)
Nom_fichier_complet(Nom_du_fichier,0);
if ((file=fopen(Nom_du_fichier, "rb")))
{
if (FileLength(file)==sizeof(T_KCF_Header))
if (File_length_file(file)==sizeof(T_KCF_Header))
{
read_bytes(file,&Buffer,sizeof(T_KCF_Header));
// On vérifie une propriété de la structure de palette:
@ -4453,7 +4423,7 @@ void Load_KCF(void)
Nom_fichier_complet(Nom_du_fichier,0);
if ((file=fopen(Nom_du_fichier, "rb")))
{
Taille_du_fichier=FileLength(file);
Taille_du_fichier=File_length_file(file);
if (Taille_du_fichier==sizeof(T_KCF_Header))
{
// Fichier KCF à l'ancien format
@ -4690,7 +4660,7 @@ void Load_SCx(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
Taille_du_fichier=FileLength(file);
Taille_du_fichier=File_length_file(file);
if ((read_bytes(file,&SCx_header,sizeof(T_SCx_Header))))
{
@ -4953,7 +4923,7 @@ void Test_PI1(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
// Vérification de la taille
size=FileLength(file);
size=File_length_file(file);
if ((size==32034) || (size==32066))
{
// Lecture et vérification de la résolution
@ -4992,7 +4962,7 @@ void Load_PI1(void)
if (read_bytes(file,buffer,32034))
{
// Initialisation de la preview
Initialiser_preview(320,200,FileLength(file),FORMAT_PI1);
Initialiser_preview(320,200,File_length_file(file),FORMAT_PI1);
if (Erreur_fichier==0)
{
// Initialisation de la palette
@ -5283,7 +5253,7 @@ void Test_PC1(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
// Vérification de la taille
size=FileLength(file);
size=File_length_file(file);
if ((size<=32066))
{
// Lecture et vérification de la résolution
@ -5316,7 +5286,7 @@ void Load_PC1(void)
Erreur_fichier=0;
if ((file=fopen(Nom_du_fichier, "rb")))
{
size=FileLength(file);
size=File_length_file(file);
// allocation des buffers mémoire
buffercomp=(byte *)malloc(size);
bufferdecomp=(byte *)malloc(32000);
@ -5326,7 +5296,7 @@ void Load_PC1(void)
if (read_bytes(file,buffercomp,size))
{
// Initialisation de la preview
Initialiser_preview(320,200,FileLength(file),FORMAT_PC1);
Initialiser_preview(320,200,File_length_file(file),FORMAT_PC1);
if (Erreur_fichier==0)
{
// Initialisation de la palette
@ -5588,8 +5558,6 @@ void Load_PNG(void)
char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
byte PNG_header[8];
dword Taille_image;
long Taille_du_fichier;
struct stat Informations_Fichier;
png_structp png_ptr;
png_infop info_ptr;
@ -5600,9 +5568,6 @@ void Load_PNG(void)
if ((file=fopen(Nom_du_fichier, "rb")))
{
stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size;
if (read_bytes(file,PNG_header,8))
{
if ( !png_sig_cmp(PNG_header, 0, 8))
@ -5667,7 +5632,7 @@ void Load_PNG(void)
}
}
}
Initialiser_preview(info_ptr->width,info_ptr->height,Taille_du_fichier,FORMAT_PNG);
Initialiser_preview(info_ptr->width,info_ptr->height,File_length_file(file),FORMAT_PNG);
if (Erreur_fichier==0)
{

3
main.c
View File

@ -40,7 +40,6 @@
#include "boutons.h"
#include "moteur.h"
#include "pages.h"
#include "files.h"
#include "loadsave.h"
#include "sdlscreen.h"
#include "erreurs.h"
@ -313,7 +312,7 @@ int Initialisation_du_programme(int argc,char * argv[])
Set_Config_Directory(Repertoire_du_programme,Repertoire_de_configuration);
// On détermine le répertoire courant:
Determiner_repertoire_courant();
getcwd(Principal_Repertoire_courant,256);
// On en profite pour le mémoriser dans le répertoire principal:
strcpy(Repertoire_initial,Principal_Repertoire_courant);

View File

@ -39,7 +39,6 @@
#include "struct.h"
#include "io.h"
#include "files.h"
int Create_ConfigDirectory(char * Config_Dir)
{

View File

@ -55,7 +55,6 @@
#include "global.h"
#include "sdlscreen.h"
#include "io.h"
#include "files.h"
typedef struct T_FONTE
{

View File

@ -24,6 +24,13 @@
#include "struct.h"
#define ToWinX(x) (((x)*Menu_Facteur_X)+Fenetre_Pos_X)
#define ToWinY(y) (((y)*Menu_Facteur_Y)+Fenetre_Pos_Y)
#define ToWinL(l) ((l)*Menu_Facteur_X)
#define ToWinH(h) ((h)*Menu_Facteur_Y)
#define Display_Window(x,y) UpdateRect(Fenetre_Pos_X,Fenetre_Pos_Y,(x)*Menu_Facteur_X,(y)*Menu_Facteur_Y);
void Afficher_curseur(void);
void Effacer_curseur(void);