DatePicker

Represent a control from where you can choose a color:

To create a color picker use DatePicker::new method (with 2 parameters: a date and a layout), or it can be created with DatePicker::with_date method (with 2 parameters: a NaiveDate object and a layout).

let d = DatePicker::new("2024-06-13", Layout::new("d:c,w:19"));
let d = DatePicker::with_date(NaiveDate::from_ymd_opt(2000, 10, 1).unwrap(), Layout::new("d:c,w:19"));

or the macro datepicker!

let d1 = datepicker!("2024-06-13,x:1,y:1,w:19");
let d2 = datepicker!("date:2024-06-13,x:1,y:1,w:19");

A DatePicker control supports all common parameters (as they are described in Instantiate via Macros section). Besides them, the following named parameters are also accepted:

Parameter nameTypePositional parameterPurpose
dateStringYes (first postional parameter)The initial date of the DatePicker in YYYY-MM-DD format or any other format supported by NaiveDate in chrono crate

Events

To intercept events from a DatePicker control, the following trait has to be implemented to the Window that processes the event loop:

pub trait DatePickerEvents {
    fn on_date_change(&mut self, _handle: Handle<DatePicker>, date: chrono::prelude::NaiveDate) -> EventProcessStatus {...}
}

Methods

Besides the Common methods for all Controls a DatePicker control also has the following aditional methods:

MethodPurpose
set_date(...)Manually sets the date of the DatePicker control. It receives an object of type NaiveDate.
set_date_str(...)Manually sets the date of the DatePicker control. It receives an string slice.
date()Returns the current date selected in the DatePicker control

Key association

The following keys are processed by a DatePicker control if it has focus:

On unexpanded calendar:

KeyPurpose
Space or EnterExtends(unpacks) the DatePicker control.
Up, DownChanges the date's day with 1 day.
Shift+Up, Shift+DownChanges the date's month by 1.
Ctrl+Up, Ctrl+DownChanges the date's year by 1.
Ctrl+Shift+Up, Ctrl+Shift+DownChanges the date's year by 10.

On expanded calendar:

KeyPurpose
EnterPacks (collapses) the DatePicker control, saving the date and triggering a call to DatePickerEvents::on_date_change(...).
EscapeIt collapses the control without saving the new date. If the DatePicker is already colapsed, this key will not be captured (meaning that one of the DatePicker ancestors will be responsable with treating this key)
Up, Down, Left, RightChanges the date's day with 1 (left, right) or 7(up, down) days.
Shift+Left, Shift+RightChanges the date's month by 1.
Ctrl+Left, Ctrl+RightChanges the date's year by 1.
Ctrl+Shift+Left, Ctrl+Shift+RightChanges the date's year by 10.

On both calendar types:

KeyPurpose
Letter (ex. D)Changes the date's month to the next month starting with that letter.
Shift+Letter (ex. D)Changes the date's month to the previous month starting with that letter. (Working for letters for which there are multiple months starting with it (ex. A))

Example

The following example creates a Window with a DatePicker. The window implements the DatePickerEvents to intercept DatePicker events.

use appcui::prelude::*;

use appcui::prelude::*;

#[Window(events=DatePickerEvents)]
struct MyWin {
    dp: Handle<DatePicker>,
}

impl MyWin{
    fn new() -> Self{
        let mut win = MyWin{
            base: window!("Dates,d:c,w:25,h:6"),
            dp: Handle::None,
        };
        win.dp = win.add(datepicker!("2024-06-13,x:1,y:1,w:19"));
        win
    }

}

impl DatePickerEvents for MyWin{
    fn on_date_change(&mut self, _handle: Handle<DatePicker>, date: chrono::prelude::NaiveDate) -> EventProcessStatus {
        self.base.set_title(&format!("Date: {}", date));
        EventProcessStatus::Processed                                                                        
    }
}

fn main(){
    let mut a =  App::new().build().unwrap();
    a.add_window(MyWin::new());
    a.run();
}