Code : Tout sélectionner
;Calendrier des fêtes fixes avec changement de mois et d'année por SpinGadgets + Vector Drawing.pb
InitSprite()
InitKeyboard()
InitMouse()
;
Enumeration Fenetre
#Fenetre_principale
EndEnumeration
Enumeration Gadgets ;
#Cnv
#Txt_Mois
#Txt_Annee
#Bouton_Quitter
#Spin_Annee
#Spin_Mois
#Police
EndEnumeration
Enumeration Fichier
#FichierJson
EndEnumeration
Enumeration Actions
#f_sortie
#f_aucune
EndEnumeration
Enumeration Table_de_verite
#Faux
#Vrai
EndEnumeration
#Quantite = 365
Structure MaDate
Jour.i
Mois.i
NSem.i ;Numéro de semaine
EndStructure
Structure Eph
Prenom.s
Quand.s
EndStructure
Global annee.w
Global NumSem.b, NbJMR.b, date, NumJS
Global JourCourant.s, MoisCourant.s, DateCourante.s
Global Semaine.b
Global.s Masque = "%dddd %dd %mmm %yyyy",
NomJours.s = "dimanche lundi mardi mercredi jeudi vendredi samedi",
NomJoursAbr.s = "dim lun mar mer jeu ven sam",
NomMois.s = "janvier février mars avril mai juin juillet août septembre octobre novembre décembre",
NomMoisAbr.s = "jan. fév. mars avr. mai juin juil. août sept. oct. nov. déc."
Global TaillePolice = 12
If LoadFont(#Police, "Calibri", TaillePolice, #PB_Font_Bold)
Global Calibri_12 = FontID(#Police)
EndIf
Global Dim Mois$(12)
Global.MaDate Dim MaDonnee(365)
Global.Eph Dim Ephemeride(#Quantite)
Global.s NewMap Fete()
;-
ExamineDesktops()
Global Largeur_ecran = DesktopWidth(0)
Global Hauteur_ecran = DesktopHeight(0)
Global Prof_ecran = DesktopDepth(0)
Global.s Fichier_de_donnees = "Data\Fetes_a_souhaiter.Json"
Global.b Quitter = #Faux
Global EspaceMois = Largeur_ecran / 6
Global CoulFond = $C0FFFF, CoulTexte, MoisEnCours = Month(Date()), Annee = Year(Date())
Global.s Texte$, JourSemaine, JourMois
Global V, JDA = 1, X = 0 , Y = 20, L = EspaceMois, H = 700, Z, i, Num_Mois, XX = X, YY = Y, F_principale_h, Resultat
Global.s DateJour, JourSemaine, JourMois, JourMois2
Global DizJourMois, UnJourMois
Declare Lire_les_donnees()
Declare.s ChaineDate(Masque.s, date.l)
Declare.b SiBissextile(Annee=-1) ; Retourne Vrai si l'année est une année bissextile (366 jours)
Declare.b JoursDansMois(annee=-1, mois=-1) ; Retourne le nombre de jours dans le mois donné (28 .. 31)
Declare TraitVertical(X, Y, Hauteur, Epaisseur = 1, Couleur = 0) ; Trace un trait vertical avec épaisseur et couleur choisies
Declare TraitHorizontal(X, Y, Longueur, Epaisseur = 1, Couleur = 0) ; Trace un trait horizontal avec épaisseur et couleur choisies
Declare Cadre(X, Y, Largeur, Hauteur, Epaisseur = 1, CouleurCadre = 0); Trace un cadre simple de la couleur choisie
Declare CadreColore(X, Y, Largeur, Hauteur, Epaisseur = 1, CouleurCadre = 0, CouleurFond = 0); Trace un cadre plein avec la couleur choisie
Declare Calculer()
Declare.i MonJDS (date.i)
Declare.i NumSem(date.i)
Declare CalculerNumSem()
Declare Affiche(Annee)
Declare Ouvrir_Fenetre_Principale()
Macro Si(expression,Vrai,Faux)
If Bool(expression)
Vrai
Else
Faux
EndIf
EndMacro
Macro se
Si(JourSemaine = "Dimanche", VectorSourceColor(RGBA(255, 0, 0, 255)), VectorSourceColor(RGBA(0, 0, 0, 255)))
MovePathCursor(XX + 4, YY)
DrawVectorText(LSet(JourSemaine, 2, " ") + " ") ; Jours de semaine en noir
If UnJourMois > 0 And DizJourMois
MovePathCursor(XX + 28, YY)
DrawVectorText(Str(DizJourMois)) ; dizaine du mois
MovePathCursor(XX + 28 + VectorTextWidth("0"), YY)
DrawVectorText(Str(UnJourMois)) ; Jour du mois
ElseIf DizJourMois < 1
MovePathCursor(XX + 28 + VectorTextWidth("0"), YY)
DrawVectorText(Str(UnJourMois)) ; dizaine du mois
ElseIf DizJourMois > 0 And UnJourMois = 0 ; 10 20 ou 30
MovePathCursor(XX + 28, YY)
DrawVectorText(Str(DizJourMois)) ; dizaine du mois
MovePathCursor(XX + 28 + VectorTextWidth("0"), YY)
DrawVectorText("0") ; Jour du mois
EndIf
EndMacro
Procedure Init()
; Initialiser les noms de mois
For i = 1 To 12
Mois$(i) = StringField(NomMois.s, i, " ")
Mois$(i) = UCase(Left(Mois$(i), 1)) + Mid(Mois$(i), 2)
Next i
EndProcedure
Procedure Calculer()
CadreColore(XX, YY - 20, EspaceMois, H, 1, $000000, $C0FFFF) ; Cadre du calendrier
;Afficher les mois, du mois courant à la fin de l'année courante
Num_Mois = MoisEnCours
Affiche(Annee)
XX = 0 : YY = 20
Select Mois$(MoisEnCours)
Case "Janvier", "Février", "Décembre"
; Hiver
CoulFond = $EEEEEE
Case "Mars", "Avril", "Mai"
; Printemps
CoulFond = $72D772
Case "Juin", "Juillet", "Août"
; été
CoulFond = $00F0F0
Case "Septembre", "Octobre", "Novembre"
; Automne
CoulFond = $81C5FE
EndSelect
CadreColore(XX, YY-20, EspaceMois, 20, 1, 0, CoulFond)
VectorSourceColor(RGBA(0, 0, 0, 255))
MovePathCursor((XX+EspaceMois/2)-VectorTextHeight(Mois$(MoisEnCours)) , YY-21)
DrawVectorText(Mois$(MoisEnCours))
XX = X
EndProcedure
Procedure.i MonJDS (date.i)
Protected d.i
d = DayOfWeek(date)
If d = 0
d = 7 ; pour le dimanche, retourne 7 au lieu de 0
EndIf
ProcedureReturn d
EndProcedure
Procedure.i NumSem(date.i)
; Les calculs sont basés sur le fait que la première semaine de l'année
; contient toujours le 4 Janvier.
; [conformément à http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
; ou mieux http://de.wikipedia.org/wiki/Woche#Kalenderwoche]
Protected jda.i=DayOfYear(date), annee.i=Year(date)
Protected DernPrec.i ; dernier jour de la dernière semaine de l'année précédente
Protected DernCour.i ; dernier jour de la dernière semaine de l'année en cours
DernPrec = 4 - MonJDS(Date(annee, 1, 4, 0,0,0))
DernCour = 4 - MonJDS(Date(annee,12,28, 0,0,0)) + DayOfYear(Date(annee,12,31, 0,0,0))
If jda <= DernCour
If jda <= DernPrec
; Le jour donné est dans la dernière semaine de l'année précédente.
jda + DayOfYear(Date(annee-1,12,31, 0,0,0))
DernPrec = 4 - MonJDS(Date(annee-1,1,4, 0,0,0))
EndIf
ProcedureReturn Round((jda-DernPrec)/7, #PB_Round_Up)
Else
; Le jour donné est dans la première semaine de l'année prochaine.
ProcedureReturn 1
EndIf
EndProcedure
Procedure CalculerNumSem()
For j = 1 To 12
For i = 1 To JoursDansMois(Year(Date()), j)
MaDonnee(JDA-1)\Jour = i
MaDonnee(JDA-1)\Mois = j
MaDonnee(JDA-1)\NSem = NumSem(Date(Year(Date()), j, i, 0, 0, 0))
JDA + 1
Next i
Next j
EndProcedure
Procedure Affiche(Annee)
For i = 1 To JoursDansMois(Annee, Num_Mois)
DateJour = ChaineDate(Masque, Date(Annee, Num_Mois, i, 0, 0, 0))
JourSemaine = StringField(DateJour, 1, " ")
JourSemaine = UCase(Left(JourSemaine, 1)) + Right(JourSemaine, Len(JourSemaine) - 1)
JourMois = StringField(DateJour, 2, " ")
DizJourMois = Val(Left(JourMois, 1))
UnJourMois = Val(Right(JourMois ,1))
Select JourSemaine ; sélection Jds
Case "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"
se ; afficher le texte en noir
Case "Dimanche" ; sélection dimanche
se ; afficher le texte en rouge
TraitHorizontal(XX, YY + VectorTextHeight(" "), EspaceMois)
V = DayOfYear(Date(Annee,Num_Mois,Val(JourMois),0,0,0))
MovePathCursor(XX + 290, YY)
DrawVectorText(Str(MaDonnee(V-1)\NSem))
EndSelect
; Fêtes fixes
JDA = DayOfYear(Date(annee,Num_Mois,Val(JourMois),0,0,0))
If SiBissextile(annee)
JDA - 2
Else
JDA - 1
EndIf
VectorSourceColor(RGBA(0, 0, 0, 255)) ;Couleur du texte noire pour les fêtes à souhaiter
MovePathCursor(XX + 70, YY) ; déplacer le curseur à la position adéquate
DrawVectorText(Fete(JourMois+"/"+RSet(Str(Num_Mois), 2, "0"))) ;Affichage de la fête à souhaiter
VectorSourceColor(RGBA(255, 0, 0, 255)) ;Couleur du texte rouge pour les fêtes fixes
If JourMois = "01" And Num_Mois = 1 : MovePathCursor(XX + 70, YY) : DrawVectorText("Nouvel An") : EndIf
If JourMois = "01" And Num_Mois = 5 : MovePathCursor(XX + 70, YY) : DrawVectorText("Fête du travail") : EndIf
If JourMois = "08" And Num_Mois = 5 : MovePathCursor(XX + 70, YY) : DrawVectorText("Victoire 1945") : EndIf
If JourMois = "14" And Num_Mois = 7 : MovePathCursor(XX + 70, YY) : DrawVectorText("Fête Nationale") : EndIf
If JourMois = "15" And Num_Mois = 8 : MovePathCursor(XX + 70, YY) : DrawVectorText("Assomption") : EndIf
If JourMois = "01" And Num_Mois = 11 : MovePathCursor(XX + 70, YY) : DrawVectorText("Toussaint") : EndIf
If JourMois = "11" And Num_Mois = 11 : MovePathCursor(XX + 70, YY) : DrawVectorText("Armistice 1918") : EndIf
;If JourMois = "25" And Num_Mois = 12 : MovePathCursor(XX + 70, YY) : DrawVectorText("Noël") : EndIf
; Encadrer auJourd'hui
If JourMois = RSet(Str(Day(Date())), 2, "0") And Num_Mois = Month(Date())
Cadre(XX + 2, YY, EspaceMois-6, 20, 3)
EndIf
YY + VectorTextHeight(" ") + 2
Next
XX + EspaceMois
YY = Y
EndProcedure
Procedure DefinirAnnee()
annee = GetGadgetState(#Spin_Annee)
CloseWindow(#Fenetre_principale)
Ouvrir_Fenetre_Principale()
EndProcedure
Procedure DefinirMois()
MoisEnCours = GetGadgetState(#Spin_Mois)
CloseWindow(#Fenetre_principale)
Ouvrir_Fenetre_Principale()
EndProcedure
Procedure Ouvrir_Fenetre_Principale()
;
; ouvrir une fenêtre maximisée
;
F_principale_h = OpenWindow(#Fenetre_principale, 0, 0, L, H + 30, "Calendrier des fêtes fixes",
#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
;
; ouvrir un canvas de la même taille que la fenêtre (c'est à dire couvrant l'ensemble)
;
CanvasGadget(#Cnv, 0, 0, L, H)
;
; créer des SpinGadgets pour changer le mois ou l'année
;
TextGadget(#Txt_Mois, 10, H+7, 25, 20, "Mois")
SpinGadget(#Spin_Mois, GadgetWidth(#Txt_Mois)+10, H+5, (EspaceMois/2)-100, 20, 1, 12, #PB_Spin_Numeric)
SpinGadget(#Spin_Annee, WindowWidth(#Fenetre_principale)-(EspaceMois/2)+90, H+5, (EspaceMois/2)-100, 20, 1970, 2034, #PB_Spin_Numeric)
TextGadget(#Txt_Annee, GadgetX(#Spin_Annee)-35, H+7, 30, 20, "Année")
SetGadgetState(#Spin_Annee, annee)
SetGadgetState(#Spin_Mois, MoisEnCours)
;
; utiliser la bibliothèque de dessin vectoriel
;
StartVectorDrawing(CanvasVectorOutput(#Cnv))
;
; police à utiliser pour le dessin vectoriel
;
VectorFont(Calibri_12)
;
; calculer les couleurs des saisons et afficher les mois et les jours
;
Calculer()
;
; terminer le dessin vectoriel
;
StopVectorDrawing()
;
; ajouter les événements des SpinGadgets
;
BindGadgetEvent(#Spin_Annee, @DefinirAnnee())
BindGadgetEvent(#Spin_Mois, @DefinirMois())
EndProcedure
Lire_les_donnees()
Init()
CalculerNumSem()
Ouvrir_Fenetre_Principale()
;
;- gestion des événements en boucle sans fin
;
Global action.i = #f_aucune
Repeat
Global event.i = WindowEvent()
Select event
Case #PB_Event_CloseWindow
action = #f_sortie
EndSelect
Until action = #f_sortie
;
; fermer la fenêtre en douceur
;
CloseWindow(#Fenetre_principale)
;
; procédures
;
Procedure Lire_les_donnees()
If ReadFile(#FichierJson, Fichier_de_donnees)
CloseFile(#FichierJson)
;Lire un fichier JSON (Analyser les données JSON à partir d'un fichier)
LoadJSON(#FichierJson, Fichier_de_donnees)
;Extraire les éléments dans le tableau spécifié
ExtractJSONArray(JSONValue(#FichierJson), Ephemeride())
For I = 0 To ArraySize( Ephemeride())
AddMapElement(Fete(), Ephemeride(I)\Quand)
Fete() = Ephemeride(I)\Prenom
Next
Else
action = #f_sortie
MessageRequester("ATTENTION","Impossible de charger le fichier")
End
EndIf
EndProcedure
Procedure.s ChaineDate(Masque.s, date.l)
Masque = ReplaceString (Masque, "%dddd" , StringField ( NomJours , DayOfWeek (date) + 1, " " ))
Masque = ReplaceString (Masque, "%ddd" , StringField ( NomJoursAbr , DayOfWeek (date) + 1, " " ))
Masque = ReplaceString (Masque, "%mmmm" , StringField ( NomMois , Month (date), " " ))
Masque = ReplaceString (Masque, "%mmm" , StringField ( NomMoisAbr , Month (date), " " ))
ProcedureReturn FormatDate (Masque, date)
EndProcedure
Procedure.b SiBissextile(Annee=-1)
; Retourne Vrai si l'année est une année bissextile (366 jours)
; S'il n'y a aucun argument, l'année en cours est utilisée
; Dans le calendrier grégorien, l'année bissextile est
; toute année divisible par 4, sauf
; année du centenaire non divisible par 400
; L'année équinoxe de printemps est d'environ 365.242374 jours longs (et croissants)
If Annee<=0: Annee = Year(Date()): EndIf ; Cette année
If (Mod(Annee,4)=0 And Mod(Annee,100)<>0) Or (Mod(Annee,400)=0)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.b JoursDansMois(annee=-1, mois=-1)
; Retourne le nombre de jours dans le mois donné (28 .. 31)
; Si l'année est absente, l'année en cours est utilisée
; Si l'année est présente mais le mois est absent, février est utilisé
; Si l'année et le mois sont tous deux absents, le mois courant de l'année en cours est utilisé
Protected Jours
If annee<=0
annee = Year(Date())
If mois<=0: mois = Month(Date()): EndIf
Else
If mois<=0: mois = 2: EndIf
EndIf
If mois=2
Jours = 28+SiBissextile(annee);
Else
jours = 31-$A55>>mois&1
EndIf
ProcedureReturn jours
EndProcedure
Procedure TraitHorizontal(X, Y, Largeur, Epaisseur = 1, Couleur = 0)
MovePathCursor(X, Y) ; Déplace le curseur au nouvel emplacement
AddPathLine(Largeur, 0, #PB_Path_Relative) ; Ajouter une ligne droite de la position actuelle aux coordonnées données
VectorSourceColor(RGBA(Red(Couleur), Green(Couleur), Blue(Couleur), 255))
StrokePath(Epaisseur)
EndProcedure
Procedure TraitVertical(X, Y, Hauteur, Epaisseur = 1, Couleur = 0)
MovePathCursor(X, Y) ; Déplace le curseur au nouvel emplacement
AddPathLine(0, Hauteur, #PB_Path_Relative) ; Ajouter une ligne droite de la position actuelle aux coordonnées données
VectorSourceColor(RGBA(Red(Couleur), Green(Couleur), Blue(Couleur), 255))
StrokePath(Epaisseur)
EndProcedure
Procedure Cadre(X, Y, Largeur, Hauteur, Epaisseur = 1, Couleur = 0)
AddPathBox(X, Y, Largeur, Hauteur)
VectorSourceColor(RGBA(Red(Couleur), Green(Couleur), Blue(Couleur), 255))
StrokePath(Epaisseur)
EndProcedure
Procedure CadreColore(x, y, Largeur, Hauteur, Epaisseur=1, CouleurCadre=0, CouleurFond=0); Trace un cadre plein avec la couleur choisie
Cadre(x+(Epaisseur/2), y+(Epaisseur/2), Largeur-(Epaisseur), Hauteur-(Epaisseur), Epaisseur, CouleurCadre)
;Remplir le cadre
AddPathBox(x+Epaisseur, y+Epaisseur, Largeur-(Epaisseur*2), Hauteur-(Epaisseur*2))
VectorSourceColor(RGBA(Red(CouleurFond), Green(CouleurFond), Blue(CouleurFond), 255))
FillPath()
EndProcedure