Tutoriel Gtk2Hs:

5.1 Calendrier

Le widget calendrier permet d’afficher et de récupérer des informations relatives à la date. C’est un widget facile à créer et à utiliser. Utilisez:

calendarNew:: IO Calendar

Par défaut, la date du jour est affichée. Pour récupérer la date d’un calendrier, utilisez:

calendarGetDate :: CalendarClass self => self -> IO (Int, Int, Int)

La sortie est de type (année,mois,jour). Notez que les mois commencent à 0. Il faut donc ajouter 1 pour que ce soit correct. Les attributs associés sont:

calendarYear :: CalendarClass self => Attr self Int
calendarMonth :: CalendarClass self => Attr self Int
calendarDay :: CalendarClass self => Attr self Int

Le widget calendrier a quelques options qui permettent de modifier l’apparence du widget. On modifie ces options avec la fonction: calendarSetDisplayOptions. Pour récupérer les réglages, on utilise : calendarGetDisplayOptions.

calendarSetDisplayOptions :: CalendarClass self => self -> [CalendarDisplayOptions] -> IO ()
calendarGetDisplayOptions :: CalendarClass self => self -> IO [CalendarDisplayOptions]

CalendarDisplayOptions a les constructeurs suivant:

  • CalendarShowHeading: Cette option indique que le mois et l’année doivent être affichés quand le calendrier s’affiche.
  • CalendarShowDayNames: Cette option indique que les 3 premières lettres de chaque jour doivent être affichées (Lun, Mar, …).
  • CalendarNoMonthChange: Cette option empêche l’utilisateur de modifier le mois affiché. Cela peut être utile si vous avez seulement besoin d’afficher un mois en particulier.
  • CalendarShowWeekNumbers: Cette option indique que le numéro de la semaine doit être indiqué en bas à gauche du calendrier.
  • CalendarWeekStartMonday: Cette option indique que le calendrier doit démarrer le Lundi et pas le Dimanche (par défaut). Cela affecte seulement l’ordre dans lequel les jours sont affichés de gauche à droite.

Ces options peuvent aussi être définies et récupérées avec les fonctions génériques get et set.

Finalement, n’importe quel nombre de jours dans le mois peuvent être . Un jour marqué est mis en surbrillance dans le calendrier. Les fonctions suivantes sont fournies pour manipuler les jours marqués:

calendarMarkDay :: CalendarClass self => self -> Int -> IO Bool
calendarUnmarkDay :: CalendarClass self => self -> Int -> IO Bool
calendarClearMarks :: CalendarClass self => self -> IO ()

Notez que les sont persistants quand on navigue à travers les mois et les années.

Le widget calendrier peut envoyer des signaux indiquant les modifications de la date. Ces signaux sont:

  • onDaySelected
  • onDaySelectedDoubleClick

L’exemple suivent montre l’utilisation d’un widget calendrier:

Gtk Gtk2Hs Calendar
import Graphics.UI.Gtk

main :: IO ()
main= do
     initGUI
     window <- windowNew
     set window [windowTitle := "Calendar",
                 windowDefaultWidth:= 200,
                 windowDefaultHeight:= 100]
     mainbox <- vBoxNew True 0
     containerAdd window mainbox

     hbox1 <- hBoxNew True 0
     boxPackStart mainbox hbox1 PackGrow 0

     cal <-calendarNew
     boxPackStart hbox1 cal PackGrow 0   

     vbox1 <- vBoxNew True 0
     frame1 <- frameNew
     set frame1 [frameLabel := "Display Options",
                 containerBorderWidth := 10,
                 frameLabelYAlign := 0.5, 
                 frameLabelXAlign := 0.5,
                 containerChild := vbox1 ]
     boxPackStart hbox1 frame1 PackGrow 0
     headingopt <- addDisplayOpt vbox1 "Show Heading"
     daynameopt <- addDisplayOpt vbox1 "Show Day Names"
     monchngopt <- addDisplayOpt vbox1 "No Month Change"
     weeknumopt <- addDisplayOpt vbox1 "Show Week Numbers"

     set headingopt [toggleButtonActive := True]
     set daynameopt [toggleButtonActive := True]

     reslabel <- labelNew Nothing
     showMess cal reslabel "Nothing Done Yet"
     frame2 <- frameNew
     set frame2 [frameLabel := "Last Action:",
                 containerBorderWidth := 10, 
                 containerChild := reslabel]
     boxPackStart mainbox frame2 PackGrow 0     

     mySetOnToggled headingopt cal calendarShowHeading
     mySetOnToggled daynameopt cal calendarShowDayNames
     mySetOnToggled monchngopt cal calendarNoMonthChange
     mySetOnToggled weeknumopt cal calendarShowWeekNumbers

     onDaySelected cal (showMess cal reslabel "Day Selected")
     onDaySelectedDoubleClick cal 
            (showMess cal reslabel "Double Click Day Selected")

     widgetShowAll window
     onDestroy window mainQuit
     mainGUI


addDisplayOpt :: VBox -> String -> IO CheckButton
addDisplayOpt box lbl = do
         cb <- checkButtonNewWithLabel lbl
         boxPackStart box cb PackGrow 5
         return cb

mySetOnToggled :: CheckButton -> Calendar -> 
               Attr Calendar Bool -> 
               IO (ConnectId CheckButton)
mySetOnToggled cb cl att = onToggled cb $ do
         cbstate <- get cb toggleButtonActive
         set cl [att := cbstate]

showMess :: Calendar -> Label -> String -> IO ()
showMess cal lbl str = do  
         (year, month, day) <- calendarGetDate cal
         labelSetText lbl $ str ++ "\n" ++ "Date = " ++
                      (show year) ++ "//" ++ 
                      (myshow (month +1))  -- month is 0 to 11
                       ++ "//" ++ (myshow day) 
                            where myshow n | n <= 9 = '0':(show n)
                                           | otherwise = show n

{- Commented out for platform specific testing:
These signals all seem to be implemented as onDaySelected.
The platform was: Gtk2Hs 0.9.12 on Fedora Core 6

     onMonthChanged cal (showMess cal reslabel "Month Changed")
     onNextMonth cal (showMess cal reslabel "Next Month Selected")
     onNextYear cal (showMess cal reslabel "Next Year Selected")
     onPrevMonth cal (showMess cal reslabel "Previous Month
Selected")
     onPrevYear cal (showMess cal reslabel "Previous Year
Selected")
-}