From cf54d4a4603c20a42d25975cdd4e0068c2d620fe Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sat, 25 Oct 2008 18:20:31 +0000 Subject: [PATCH] Load/Save: "Select Drive" button. Allows a way for the AmigaOS4 version to display the list of drives / volume names. Peter, you can plug in Lire_liste_des_lecteurs(void) to enumerate the drives. Additionally, if you want to display drive icons as well, you have a spot in Rechercher_drives(void) : For each drive, call Ajouter_lecteur(car, icon, string); * car is the displayed character * string is the drive name "df0:", "mypictures:" etc. (string will be copied) * icon is one of : LECTEUR_FLOPPY_3_5 LECTEUR_FLOPPY_5_25 LECTEUR_HDD LECTEUR_CDROM LECTEUR_NETWORK git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@309 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- aide.c | 1 + boutons.c | 48 ++++++++++++++++++++++++++------------ files.c | 69 ++++++++++++++++++++++++++++++++++++++++++++----------- files.h | 10 ++++---- gfxcfg.c | 1 + init.c | 51 ++++++++++++++++------------------------ linux.c | 1 + main.c | 2 ++ readini.c | 1 + saveini.c | 1 + struct.h | 6 ++--- 11 files changed, 124 insertions(+), 67 deletions(-) diff --git a/aide.c b/aide.c index 3ff9d675..4d63ab52 100644 --- a/aide.c +++ b/aide.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2008 Yves Rizoud Copyright 2008 Franck Charlet Copyright 2007 Adrien Destugues diff --git a/boutons.c b/boutons.c index 3a4a6f01..40c38aaf 100644 --- a/boutons.c +++ b/boutons.c @@ -47,6 +47,7 @@ #include "io.h" #include "aide.h" #include "texte.h" +#include "sdlscreen.h" #ifdef __WATCOMC__ #include @@ -2241,6 +2242,8 @@ void Print_Format(void) } +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 Decalage, struct Fenetre_Bouton_scroller * Enreg) @@ -2257,7 +2260,7 @@ void Preparer_et_afficher_liste_fichiers(short Position, short Decalage, 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,Decalage,Principal_Nom_fichier); + Determiner_element_de_la_liste(Position,Decalage,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 @@ -2287,7 +2290,7 @@ void On_vient_de_scroller_dans_le_fileselect(struct Fenetre_Bouton_scroller * Sc 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); + 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; @@ -2367,7 +2370,6 @@ char * Nom_correspondant_le_mieux_a(char * Nom) 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 @@ -2472,13 +2474,16 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) Print_Format(); + // Selecteur de Lecteur / Volume + Fenetre_Definir_bouton_normal(8,21,120,14,"Select drive",0,1,SDLK_LAST); // 9 + // Définition des boutons représentant les lecteurs - Drives_Debut_Y=(Nb_drives<=13)? 23 : 18; + Drives_Debut_Y=(Nb_drives<=8)? 23 : 18; for (Temp=0; TempNomAbrege,Nom_formate(Enreg->d_name)); - strcpy(Element_temporaire->NomComplet,Enreg->d_name); - stat(Enreg->d_name,&Infos_enreg); - Element_temporaire->Type = S_ISDIR(Infos_enreg.st_mode); + strcpy(Element_temporaire->NomAbrege,Nom_formate(Nom, Type)); + strcpy(Element_temporaire->NomComplet,Nom); + Element_temporaire->Type = Type; Element_temporaire->Suivant =Liste_du_fileselect; Element_temporaire->Precedent=NULL; @@ -285,8 +285,8 @@ void Lire_liste_des_fichiers(byte Format_demande) Config.Lire_les_repertoires_caches || !isHidden(Enreg))) { - // On rajoute le répertore à la liste - Ajouter_element_a_la_liste(Enreg); + // On rajoute le répertoire à la liste + Ajouter_element_a_la_liste(Enreg->d_name, 1); Liste_Nb_repertoires++; } else if (S_ISREG(Infos_enreg.st_mode) && //Il s'agit d'un fichier @@ -296,7 +296,7 @@ void Lire_liste_des_fichiers(byte Format_demande) if (VerifieExtension(Enreg->d_name, Filtre)) { // On rajoute le fichier à la liste - Ajouter_element_a_la_liste(Enreg); + Ajouter_element_a_la_liste(Enreg->d_name, 0); Liste_Nb_fichiers++; } } @@ -306,6 +306,42 @@ void Lire_liste_des_fichiers(byte Format_demande) Liste_Nb_elements=Liste_Nb_repertoires+Liste_Nb_fichiers; } +// -- Lecture d'une liste de lecteurs / volumes ----------------------------- +void Lire_liste_des_lecteurs(void) +{ + int Indice; + + // Empty the current content of fileselector: + Detruire_liste_du_fileselect(); + // Reset number of items + Liste_Nb_fichiers=0; + Liste_Nb_repertoires=0; + + // AmigaOS4 + #ifdef __amigaos4__ + // Peter, this is where you act :) + // The strings you pass will be copied as needed. + // The 2 is for drive/volume; 0 and 1 would be files and directories. + // samples: + Ajouter_element_a_la_liste("df0", 2); + Liste_Nb_repertoires++; + Ajouter_element_a_la_liste("df1", 2); + Liste_Nb_repertoires++; + Ajouter_element_a_la_liste("hd0", 2); + Liste_Nb_repertoires++; + + // Other platforms: simply read the "static" list of Drives. + #else + for (Indice=0; Indice Inversion - if ( (Element_courant->Type==0) && (Element_suivant->Type==1) ) + if ( Element_courant->Type < Element_suivant->Type ) Inversion=1; // Si les deux éléments sont de même type et que le nom du suivant // est plus petit que celui du courant -> Inversion @@ -464,7 +500,7 @@ 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 * Libelle) +void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select,char * Libelle,int *Type) // // Decalage_premier = Décalage entre le premier fichier visible dans le // sélecteur et le premier fichier de la liste @@ -474,6 +510,8 @@ void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select // // Libelle = Chaine de réception du libellé de l'élément // +// Type = Récupération du type: 0 fichier, 1 repertoire, 2 lecteur. +// Passer NULL si pas interessé. { struct Element_de_liste_de_fileselect * Element_courant; @@ -491,6 +529,9 @@ void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select // On recopie la chaîne strcpy(Libelle, Element_courant->NomComplet); + + if (Type != NULL) + *Type=Element_courant->Type; } // Fin du test d'existence de fichiers } diff --git a/files.h b/files.h index c9c7164b..b85f9245 100644 --- a/files.h +++ b/files.h @@ -32,12 +32,14 @@ int Fichier_existe(char * Fichier); 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 * Libelle); +void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select,char * Libelle,int *Type); // -- Déplacements dans la liste des fichiers ------------------------------- @@ -48,6 +50,6 @@ void Select_Page_Up (short * Decalage_premier,short * Decalage_select); 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 * Nom); +short Calculer_decalage_click_dans_fileselector(void); + +char * Nom_formate(char * Nom, int Type); diff --git a/gfxcfg.c b/gfxcfg.c index ba9e8c37..b7539aaf 100644 --- a/gfxcfg.c +++ b/gfxcfg.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2008 Yves Rizoud Copyright 2008 Adrien Destugues Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) diff --git a/init.c b/init.c index c8477567..c8ef392e 100644 --- a/init.c +++ b/init.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2008 Yves Rizoud Copyright 2008 Franck Charlet Copyright 2007 Adrien Destugues @@ -72,11 +73,13 @@ void Chercher_repertoire_du_programme(char * Chaine) } // Ajouter un lecteur à la liste de lecteurs -void Ajouter_lecteur(char Lettre, byte Type) -{ +void Ajouter_lecteur(char Lettre, byte Type, char *Chemin) +{ Drive[Nb_drives].Lettre=Lettre; Drive[Nb_drives].Type =Type; - + Drive[Nb_drives].Chemin=(char *)malloc(strlen(Chemin)+1); + strcpy(Drive[Nb_drives].Chemin, Chemin); + Nb_drives++; } @@ -85,16 +88,22 @@ void Ajouter_lecteur(char Lettre, byte Type) void Rechercher_drives(void) { - #if defined(__linux__) || defined(__amigaos4__) + #if defined(__linux__) //Sous linux, il n'y a pas de lecteurs, on va juste mettre // un disque dur qui pointera vers la racine, // et un autre vers le home directory de l'utilisateur. - Ajouter_lecteur('/', LECTEUR_HDD); - Ajouter_lecteur('~', LECTEUR_HDD); - #else + char * Home = getenv("HOME"); + Ajouter_lecteur('/', LECTEUR_HDD, "/"); + Ajouter_lecteur('~', LECTEUR_HDD, Home ? Home : ""); + + #elif defined(__amigaos4__) + // No icons by default. + // It's possible to add some here. + #elif defined (__WIN32__) + char NomLecteur[]="A:\\"; int DriveBits = GetLogicalDrives(); int IndiceLecteur; - int IndiceBit; + int IndiceBit; // Sous Windows, on a la totale, presque aussi bien que sous DOS: IndiceLecteur = 0; for (IndiceBit=0; IndiceBit<26 && IndiceLecteur<23; IndiceBit++) @@ -125,7 +134,8 @@ void Rechercher_drives(void) TypeLecteur=LECTEUR_NETWORK; break; } - Ajouter_lecteur('A'+IndiceBit, TypeLecteur); + NomLecteur[0]='A'+IndiceBit; + Ajouter_lecteur(NomLecteur[0], TypeLecteur,NomLecteur); IndiceLecteur++; } } @@ -136,28 +146,7 @@ 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; - #if defined(__linux__)||defined(__amigaos4__) - return chdir(Home); - #else - return ! SetCurrentDirectory(Home); - #endif - } - - #if defined(__linux__)||defined(__amigaos4__) - char NomLecteur[]=" "; - NomLecteur[0]=Drive[NumeroLecteur].Lettre; - return chdir(NomLecteur); - #else - char NomLecteur[]="A:\\"; - NomLecteur[0]=Drive[NumeroLecteur].Lettre; - return ! SetCurrentDirectory(NomLecteur); - #endif + return chdir(Drive[NumeroLecteur].Chemin); } void Charger_DAT(void) diff --git a/linux.c b/linux.c index 504ddf89..4f96b3b7 100644 --- a/linux.c +++ b/linux.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2007 Adrien Destugues Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) diff --git a/main.c b/main.c index 276cb8cb..0a034d0a 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2008 Franck Charlet Copyright 2007 Adrien Destugues Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) @@ -46,6 +47,7 @@ #include "saveini.h" #include "linux.h" #include "io.h" +#include "texte.h" #ifndef __linux__ #ifndef __amigaos4__ diff --git a/readini.c b/readini.c index 39c87b3b..174c8190 100644 --- a/readini.c +++ b/readini.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2008 Yves Rizoud Copyright 2007 Adrien Destugues Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) diff --git a/saveini.c b/saveini.c index 594855b3..209104c1 100644 --- a/saveini.c +++ b/saveini.c @@ -1,5 +1,6 @@ /* Grafx2 - The Ultimate 256-color bitmap paint program + Copyright 2008 Peter Gordon Copyright 2008 Yves Rizoud Copyright 2007 Adrien Destugues Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) diff --git a/struct.h b/struct.h index e5d3fcbc..a5e51de1 100644 --- a/struct.h +++ b/struct.h @@ -106,8 +106,8 @@ struct Fenetre_Bouton_special struct T_Drive { char Lettre; - byte Type; // 0: Diskette 3"« / 1: Diskette 5"¬ / 2: HDD / 3: CD-ROM / 4: Logique - char Chemin[4]; // Reservé pour "x:\", ou "/", ou "~" + byte Type; // 0: Diskette 3.5" / 1: Diskette 5.25" / 2: HDD / 3: CD-ROM / 4: Logique + char *Chemin; // Reservé pour "x:\", ou "/", "DF0:", etc. }; @@ -116,7 +116,7 @@ struct Element_de_liste_de_fileselect { char NomAbrege[13]; // Le nom tel qu'affiché dans le fileselector char NomComplet[256]; // Le nom du fichier ou du répertoire - byte Type; // Type d'élément : 0 = Fichier, 1 = Répertoire + byte Type; // Type d'élément : 0 = Fichier, 1 = Répertoire, 2 = Lecteur // données de chaînage de la liste struct Element_de_liste_de_fileselect * Suivant;