From 9f85f5f1bbcbdae5510d163c9fe6540dc30ec01f Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Thu, 26 Feb 2009 00:31:36 +0000 Subject: [PATCH] Bookmarks (issue 92) are now functional in Save/Load screens git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@656 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 87 ++++++++++++++++++++++++++++++++++++++++++------- const.h | 2 +- files.c | 15 +++++++++ files.h | 2 ++ gfx2def.ini | 16 +++++++++ global.h | 2 ++ moteur.c | 5 ++- readini.c | 94 +++++++++++++++++++++++++++++++++++++++-------------- saveini.c | 13 ++++++++ 9 files changed, 198 insertions(+), 38 deletions(-) diff --git a/boutons.c b/boutons.c index 2983be96..2d38fa08 100644 --- a/boutons.c +++ b/boutons.c @@ -2552,16 +2552,15 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) Fenetre_Definir_bouton_normal(8,17,117,23,"Select drive",0,1,SDLK_LAST); // 9 // Bookmarks - for (Temp=0;Temp<4;Temp++) + for (Temp=0;TempPos_X+3,Dropdown_bookmark[Temp]->Pos_Y+2,5); - Print_dans_fenetre(Dropdown_bookmark[Temp]->Pos_X+3+10,Dropdown_bookmark[Temp]->Pos_Y+2,Lib[Temp],Temp<3?CM_Noir:CM_Fonce,CM_Clair); Fenetre_Dropdown_choix(Dropdown_bookmark[Temp],0,"Set"); Fenetre_Dropdown_choix(Dropdown_bookmark[Temp],1,"Rename"); Fenetre_Dropdown_choix(Dropdown_bookmark[Temp],2,"Clear"); + 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) @@ -2837,7 +2836,67 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) Nouvelle_preview=1; break; default: - break; + 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; + } + 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]) + { + Readline_ex(Dropdown_bookmark[Bouton_clicke-10]->Pos_X+3+10,Dropdown_bookmark[Bouton_clicke-10]->Pos_Y+2,Config.Bookmark_label[Bouton_clicke-10],8,8,0); + Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); + Afficher_curseur(); + } + break; + + case 2: // Clear + if (Config.Bookmark_directory[Bouton_clicke-10]) + { + 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) @@ -2964,14 +3023,18 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) } // On doit rentrer dans le répertoire: - 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); + 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(); diff --git a/const.h b/const.h index e129cd62..3888e572 100644 --- a/const.h +++ b/const.h @@ -63,7 +63,7 @@ #define NB_PAGES_UNDO_MAX 99 // Nombre maximal de pages d'undo #define FACTEUR_DE_ZOOM_PAR_DEFAUT 4 // Facteur de zoom initial #define TAILLE_CHEMIN_FICHIER 260 // Le nombre de caractères maxi pour un nom de fichier avec chemin complet - +#define NB_BOOKMARKS 4 // Nombre de boutons "signet" dans l'ecran Save/Load // Caractères présents dans les deux fontes #define CARACTERE_TRIANGLE_DROIT 16 #define CARACTERE_TRIANGLE_GAUCHE 17 diff --git a/files.c b/files.c index fff28e62..8c59c8ec 100644 --- a/files.c +++ b/files.c @@ -713,6 +713,21 @@ short Calculer_decalage_click_dans_fileselector(void) return Decalage_calcule; } +void Afficher_bookmark(struct Fenetre_Bouton_dropdown * Bouton, int Numero_bookmark) +{ + if (Config.Bookmark_directory[Numero_bookmark]) + { + int Taille; + Print_dans_fenetre_limite(Bouton->Pos_X+3+10,Bouton->Pos_Y+2,Config.Bookmark_label[Numero_bookmark],8,CM_Noir,CM_Clair); + Taille=strlen(Config.Bookmark_label[Numero_bookmark]); + if (Taille<8) + Block(Fenetre_Pos_X+(Menu_Facteur_X*(Bouton->Pos_X+3+10+Taille*8)),Fenetre_Pos_Y+(Menu_Facteur_Y*(Bouton->Pos_Y+2)),Menu_Facteur_X*(8-Taille)*8,Menu_Facteur_Y*8,CM_Clair); + } + else + Print_dans_fenetre(Bouton->Pos_X+3+10,Bouton->Pos_Y+2,"--------",CM_Fonce,CM_Clair); +} + + void for_each_file(const char * Nom_repertoire, void Callback(const char *)) { // Pour scan de répertoire diff --git a/files.h b/files.h index 81aa4da5..8f6f781a 100644 --- a/files.h +++ b/files.h @@ -35,6 +35,8 @@ 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,int *Type); +void Afficher_bookmark(struct Fenetre_Bouton_dropdown * Bouton, int Numero_bookmark); + // -- Déplacements dans la liste des fichiers ------------------------------- void Select_Scroll_Down(short * Decalage_premier,short * Decalage_select); diff --git a/gfx2def.ini b/gfx2def.ini index 3ab7201b..08a7961f 100644 --- a/gfx2def.ini +++ b/gfx2def.ini @@ -308,3 +308,19 @@ ; 1 to 16. The menu can always display the number of lines you request. ; Palette_Cells_Y = 8; (Default 8) + + ; Bookmarked directories. Leave the directory blank for unused ones. + ; + Bookmark_label = + Bookmark_directory = + + Bookmark_label = + Bookmark_directory = + + Bookmark_label = + Bookmark_directory = + + Bookmark_label = + Bookmark_directory = + + ; end of configuration diff --git a/global.h b/global.h index e3af3458..ab335598 100644 --- a/global.h +++ b/global.h @@ -83,6 +83,8 @@ GFX2_GLOBAL struct S_Config byte Taille_ecran_dans_GIF; byte Auto_nb_used; byte Resolution_par_defaut; + char *Bookmark_directory[NB_BOOKMARKS]; // independant malloc of adaptive size + char Bookmark_label[NB_BOOKMARKS][8+1]; } Config; // Tableau des touches spéciales diff --git a/moteur.c b/moteur.c index 7a2ab503..2fc16e5d 100644 --- a/moteur.c +++ b/moteur.c @@ -2217,7 +2217,6 @@ short Fenetre_Dropdown_click(struct Fenetre_Bouton_dropdown *Bouton) Fenetre_Desenfoncer_bouton_normal(Bouton->Pos_X,Bouton->Pos_Y,Bouton->Largeur,Bouton->Hauteur); Afficher_curseur(); - Fenetre_Attribut2=0; if (Indice_selectionne>=0 && Indice_selectionnePremier_choix; Indice_selectionne; Choix=Choix->Next,Indice_selectionne--) @@ -2230,6 +2229,7 @@ short Fenetre_Dropdown_click(struct Fenetre_Bouton_dropdown *Bouton) } return Bouton->Numero; } + Fenetre_Attribut2=-1; return 0; } @@ -2434,7 +2434,10 @@ short Fenetre_Numero_bouton_clicke(void) if (Mouse_K & Temp5->Bouton_actif) return Fenetre_Dropdown_click(Temp5); else + { + Fenetre_Attribut2=-1; return Fenetre_bouton_normal_click(Temp5->Pos_X,Temp5->Pos_Y,Temp5->Largeur,Temp5->Hauteur,Temp5->Numero); + } } } diff --git a/readini.c b/readini.c index b3d6a157..d172c518 100644 --- a/readini.c +++ b/readini.c @@ -31,14 +31,21 @@ void Charger_INI_Clear_string(char * String) { int Indice; + int Egal_trouve=0; for (Indice=0;String[Indice]!='\0';) { - if ((String[Indice]==' ') || - (String[Indice]=='\t')) + if ((String[Indice]=='=')) + { + Egal_trouve=1; + Indice++; + // On enleve les espaces après le '=' + while (String[Indice]==' ' || String[Indice]=='\t') + memmove(String+Indice,String+Indice+1,strlen(String+Indice)); + } + else if ((String[Indice]==' ' && !Egal_trouve) || (String[Indice]=='\t')) { // Suppression d'un espace ou d'un tab: - memmove(String+Indice,String+Indice+1,strlen(String+Indice)); } else @@ -48,17 +55,25 @@ void Charger_INI_Clear_string(char * String) (String[Indice]=='\n')) { // Rencontre d'un commentaire ou d'un saut de ligne: - String[Indice]='\0'; } else { - // Passage en majuscule d'un caractère: - - String[Indice]=toupper((int)String[Indice]); + if (!Egal_trouve) + { + // Passage en majuscule d'un caractère: + + String[Indice]=toupper((int)String[Indice]); + } Indice++; } } + // On enlève les espaces avant la fin de chaine + while (Indice>0 && (String[Indice-1]==' ' || String[Indice-1]=='\t')) + { + Indice--; + String[Indice]='\0'; + } } @@ -173,10 +188,6 @@ int Charger_INI_Get_string(FILE * File,char * Buffer,char * Option,char * Retour Indice_buffer=Charger_INI_Seek_pattern(Buffer_upper,"="); strcpy(Retour, Buffer_upper + Indice_buffer); - // On coupe la chaine au premier espace ou ; (commentaire) - for (Indice_buffer=0; Retour[Indice_buffer]!='\0' && Retour[Indice_buffer]!=' ' && Retour[Indice_buffer]!=';'; Indice_buffer++) - ; - Retour[Indice_buffer]='\0'; } } while (!Arret); @@ -191,28 +202,28 @@ int Charger_INI_Get_value(char * String,int * Index,int * Value) { // On teste si la valeur actuelle est YES (ou Y): - if (Charger_INI_Seek_pattern(String+(*Index),"YES,")==1) + if (Charger_INI_Seek_pattern(String+(*Index),"yes,")==1) { (*Value)=1; (*Index)+=4; return 0; } else - if (strcmp(String+(*Index),"YES")==0) + if (strcmp(String+(*Index),"yes")==0) { (*Value)=1; (*Index)+=3; return 0; } else - if (Charger_INI_Seek_pattern(String+(*Index),"Y,")==1) + if (Charger_INI_Seek_pattern(String+(*Index),"y,")==1) { (*Value)=1; (*Index)+=2; return 0; } else - if (strcmp(String+(*Index),"Y")==0) + if (strcmp(String+(*Index),"y")==0) { (*Value)=1; (*Index)+=1; @@ -222,28 +233,28 @@ int Charger_INI_Get_value(char * String,int * Index,int * Value) // On teste si la valeur actuelle est NO (ou N): - if (Charger_INI_Seek_pattern(String+(*Index),"NO,")==1) + if (Charger_INI_Seek_pattern(String+(*Index),"no,")==1) { (*Value)=0; (*Index)+=3; return 0; } else - if (strcmp(String+(*Index),"NO")==0) + if (strcmp(String+(*Index),"no")==0) { (*Value)=0; (*Index)+=2; return 0; } else - if (Charger_INI_Seek_pattern(String+(*Index),"N,")==1) + if (Charger_INI_Seek_pattern(String+(*Index),"n,")==1) { (*Value)=0; (*Index)+=2; return 0; } else - if (strcmp(String+(*Index),"N")==0) + if (strcmp(String+(*Index),"n")==0) { (*Value)=0; (*Index)+=1; @@ -391,10 +402,10 @@ int Charger_INI(struct S_Config * Conf) FILE * Fichier; char * Buffer; int Valeurs[3]; - //int Indice; + int Indice; char * Nom_du_fichier; int Retour; - char Libelle_resolution[1024]; + char Libelle_valeur[1024]; Ligne_INI=0; @@ -676,9 +687,9 @@ int Charger_INI(struct S_Config * Conf) // Optionnel, le mode video par défaut (à partir de beta 97.0%) Conf->Resolution_par_defaut=0; - if (!Charger_INI_Get_string (Fichier,Buffer,"Default_video_mode",Libelle_resolution)) + if (!Charger_INI_Get_string (Fichier,Buffer,"Default_video_mode",Libelle_valeur)) { - int Mode = Conversion_argument_mode(Libelle_resolution); + int Mode = Conversion_argument_mode(Libelle_valeur); if (Mode>=0) Conf->Resolution_par_defaut=Mode; } @@ -719,6 +730,41 @@ int Charger_INI(struct S_Config * Conf) goto Erreur_ERREUR_INI_CORROMPU; Conf->Palette_Cells_Y=Valeurs[0]; } + // Optionnel, bookmarks (>98.0%) + for (Indice=0;IndiceBookmark_directory[Indice]=NULL; + Conf->Bookmark_label[Indice][0]='\0'; + } + for (Indice=0;Indice8) + { + Libelle_valeur[7]=CARACTERE_SUSPENSION; + Libelle_valeur[8]='\0'; + } + strcpy(Conf->Bookmark_label[Indice],Libelle_valeur); + } + } + else + break; + if (!Charger_INI_Get_string (Fichier,Buffer,"Bookmark_directory",Libelle_valeur)) + { + int Taille=0; + if (Libelle_valeur && (Taille=strlen(Libelle_valeur))!=0) + { + Conf->Bookmark_directory[Indice]=(char *)malloc(Taille+1); + strcpy(Conf->Bookmark_directory[Indice],Libelle_valeur); + } + } + else + break; + } fclose(Fichier); @@ -729,7 +775,7 @@ int Charger_INI(struct S_Config * Conf) // Gestion des erreurs: Erreur_Retour: - + printf(Buffer); fclose(Fichier); free(Nom_du_fichier); free(Buffer); diff --git a/saveini.c b/saveini.c index 09c7cf12..149b7182 100644 --- a/saveini.c +++ b/saveini.c @@ -244,6 +244,10 @@ int Sauver_INI_Set_strings(FILE * Old_file,FILE * New_file,char * Buffer,char * Buffer_upper=(char *)malloc(1024); Buffer_resultat=(char *)malloc(1024); + // On convertit un eventuel argument NULL en chaine vide. + if (Value == NULL) + Value=""; + // On commence par se faire une version majuscule de l'option à rechercher: strcpy(Option_upper,Option); Charger_INI_Clear_string(Option_upper); @@ -394,6 +398,7 @@ int Sauver_INI(struct S_Config * Conf) int Retour; char Nom_du_fichier_DAT[TAILLE_CHEMIN_FICHIER]; int Ini_existe; + int Indice; // On alloue les zones de mémoire: Buffer=(char *)malloc(1024); @@ -614,6 +619,14 @@ int Sauver_INI(struct S_Config * Conf) Valeurs[0]=(Conf->Palette_Cells_Y); if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Palette_Cells_Y",1,Valeurs,0))) goto Erreur_Retour; + + for (Indice=0;IndiceBookmark_label[Indice]))) + goto Erreur_Retour; + if ((Retour=Sauver_INI_Set_strings (Ancien_fichier,Nouveau_fichier,Buffer,"Bookmark_directory",Conf->Bookmark_directory[Indice]))) + goto Erreur_Retour; + } Sauver_INI_Flush(Ancien_fichier,Nouveau_fichier,Buffer);