213 lines
7.5 KiB
C++
213 lines
7.5 KiB
C++
|
|
// wxCalendarCtrl Test - Date selection
|
||
|
|
// Tests wxCalendarCtrl for date picking functionality
|
||
|
|
|
||
|
|
#include "wx/wx.h"
|
||
|
|
#include "wx/calctrl.h"
|
||
|
|
#include "wx/datectrl.h"
|
||
|
|
#include "wx/dateevt.h"
|
||
|
|
|
||
|
|
class CalendarFrame : public wxFrame
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
CalendarFrame() : wxFrame(nullptr, wxID_ANY, "wxCalendarCtrl Test",
|
||
|
|
wxDefaultPosition, wxSize(700, 550))
|
||
|
|
{
|
||
|
|
wxPanel* mainPanel = new wxPanel(this);
|
||
|
|
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
|
||
|
|
|
||
|
|
// Description
|
||
|
|
wxStaticText* desc = new wxStaticText(mainPanel, wxID_ANY,
|
||
|
|
"KiCad may use wxCalendarCtrl for date-related features.\n"
|
||
|
|
"This tests calendar widget rendering and date selection.");
|
||
|
|
mainSizer->Add(desc, 0, wxALL, 5);
|
||
|
|
|
||
|
|
// Horizontal layout for calendar and controls
|
||
|
|
wxBoxSizer* hSizer = new wxBoxSizer(wxHORIZONTAL);
|
||
|
|
|
||
|
|
// Calendar control
|
||
|
|
wxStaticBoxSizer* calBox = new wxStaticBoxSizer(wxVERTICAL, mainPanel, "Calendar");
|
||
|
|
m_calendar = new wxCalendarCtrl(mainPanel, wxID_ANY, wxDefaultDateTime,
|
||
|
|
wxDefaultPosition, wxDefaultSize,
|
||
|
|
wxCAL_SHOW_HOLIDAYS | wxCAL_SHOW_SURROUNDING_WEEKS);
|
||
|
|
calBox->Add(m_calendar, 1, wxEXPAND | wxALL, 5);
|
||
|
|
hSizer->Add(calBox, 1, wxEXPAND | wxRIGHT, 10);
|
||
|
|
|
||
|
|
// Controls panel
|
||
|
|
wxBoxSizer* controlSizer = new wxBoxSizer(wxVERTICAL);
|
||
|
|
|
||
|
|
// Date picker
|
||
|
|
wxStaticBoxSizer* pickerBox = new wxStaticBoxSizer(wxVERTICAL, mainPanel, "Date Picker");
|
||
|
|
m_datePicker = new wxDatePickerCtrl(mainPanel, wxID_ANY);
|
||
|
|
pickerBox->Add(m_datePicker, 0, wxEXPAND | wxALL, 5);
|
||
|
|
controlSizer->Add(pickerBox, 0, wxEXPAND | wxBOTTOM, 10);
|
||
|
|
|
||
|
|
// Navigation buttons
|
||
|
|
wxStaticBoxSizer* navBox = new wxStaticBoxSizer(wxVERTICAL, mainPanel, "Navigation");
|
||
|
|
|
||
|
|
wxButton* btnToday = new wxButton(mainPanel, wxID_ANY, "Today");
|
||
|
|
wxButton* btnPrevMonth = new wxButton(mainPanel, wxID_ANY, "Previous Month");
|
||
|
|
wxButton* btnNextMonth = new wxButton(mainPanel, wxID_ANY, "Next Month");
|
||
|
|
wxButton* btnPrevYear = new wxButton(mainPanel, wxID_ANY, "Previous Year");
|
||
|
|
wxButton* btnNextYear = new wxButton(mainPanel, wxID_ANY, "Next Year");
|
||
|
|
|
||
|
|
btnToday->Bind(wxEVT_BUTTON, &CalendarFrame::OnToday, this);
|
||
|
|
btnPrevMonth->Bind(wxEVT_BUTTON, &CalendarFrame::OnPrevMonth, this);
|
||
|
|
btnNextMonth->Bind(wxEVT_BUTTON, &CalendarFrame::OnNextMonth, this);
|
||
|
|
btnPrevYear->Bind(wxEVT_BUTTON, &CalendarFrame::OnPrevYear, this);
|
||
|
|
btnNextYear->Bind(wxEVT_BUTTON, &CalendarFrame::OnNextYear, this);
|
||
|
|
|
||
|
|
navBox->Add(btnToday, 0, wxEXPAND | wxALL, 2);
|
||
|
|
navBox->Add(btnPrevMonth, 0, wxEXPAND | wxALL, 2);
|
||
|
|
navBox->Add(btnNextMonth, 0, wxEXPAND | wxALL, 2);
|
||
|
|
navBox->Add(btnPrevYear, 0, wxEXPAND | wxALL, 2);
|
||
|
|
navBox->Add(btnNextYear, 0, wxEXPAND | wxALL, 2);
|
||
|
|
|
||
|
|
controlSizer->Add(navBox, 0, wxEXPAND | wxBOTTOM, 10);
|
||
|
|
|
||
|
|
// Selected date display
|
||
|
|
wxStaticBoxSizer* selBox = new wxStaticBoxSizer(wxVERTICAL, mainPanel, "Selected Date");
|
||
|
|
m_selectedLabel = new wxStaticText(mainPanel, wxID_ANY, "No date selected");
|
||
|
|
selBox->Add(m_selectedLabel, 0, wxALL, 5);
|
||
|
|
controlSizer->Add(selBox, 0, wxEXPAND);
|
||
|
|
|
||
|
|
hSizer->Add(controlSizer, 0, wxEXPAND);
|
||
|
|
mainSizer->Add(hSizer, 0, wxEXPAND | wxALL, 5);
|
||
|
|
|
||
|
|
// Event log
|
||
|
|
mainSizer->Add(new wxStaticText(mainPanel, wxID_ANY, "Event Log"), 0, wxLEFT | wxTOP, 5);
|
||
|
|
m_log = new wxTextCtrl(mainPanel, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 120),
|
||
|
|
wxTE_MULTILINE | wxTE_READONLY);
|
||
|
|
mainSizer->Add(m_log, 1, wxEXPAND | wxALL, 5);
|
||
|
|
|
||
|
|
mainPanel->SetSizer(mainSizer);
|
||
|
|
|
||
|
|
// Bind calendar events
|
||
|
|
m_calendar->Bind(wxEVT_CALENDAR_SEL_CHANGED, &CalendarFrame::OnDateChanged, this);
|
||
|
|
m_calendar->Bind(wxEVT_CALENDAR_DAY_CHANGED, &CalendarFrame::OnDayChanged, this);
|
||
|
|
m_calendar->Bind(wxEVT_CALENDAR_MONTH_CHANGED, &CalendarFrame::OnMonthChanged, this);
|
||
|
|
m_calendar->Bind(wxEVT_CALENDAR_YEAR_CHANGED, &CalendarFrame::OnYearChanged, this);
|
||
|
|
m_calendar->Bind(wxEVT_CALENDAR_DOUBLECLICKED, &CalendarFrame::OnDoubleClicked, this);
|
||
|
|
|
||
|
|
m_datePicker->Bind(wxEVT_DATE_CHANGED, &CalendarFrame::OnPickerChanged, this);
|
||
|
|
|
||
|
|
// Status bar
|
||
|
|
CreateStatusBar();
|
||
|
|
SetStatusText("Calendar test app started");
|
||
|
|
|
||
|
|
Log("Calendar test app started");
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
private:
|
||
|
|
void Log(const wxString& msg)
|
||
|
|
{
|
||
|
|
m_log->AppendText(msg + "\n");
|
||
|
|
}
|
||
|
|
|
||
|
|
void UpdateSelectedLabel()
|
||
|
|
{
|
||
|
|
wxDateTime date = m_calendar->GetDate();
|
||
|
|
m_selectedLabel->SetLabel(date.FormatDate());
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnDateChanged(wxCalendarEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = event.GetDate();
|
||
|
|
Log(wxString::Format("Date selected: %s", date.FormatDate()));
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
m_datePicker->SetValue(date);
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnDayChanged(wxCalendarEvent& event)
|
||
|
|
{
|
||
|
|
Log(wxString::Format("Day changed: %d", event.GetDate().GetDay()));
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnMonthChanged(wxCalendarEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = event.GetDate();
|
||
|
|
Log(wxString::Format("Month changed: %s %d",
|
||
|
|
wxDateTime::GetMonthName(date.GetMonth()), date.GetYear()));
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnYearChanged(wxCalendarEvent& event)
|
||
|
|
{
|
||
|
|
Log(wxString::Format("Year changed: %d", event.GetDate().GetYear()));
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnDoubleClicked(wxCalendarEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = event.GetDate();
|
||
|
|
Log(wxString::Format("Double-clicked: %s", date.FormatDate()));
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnPickerChanged(wxDateEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = event.GetDate();
|
||
|
|
m_calendar->SetDate(date);
|
||
|
|
Log(wxString::Format("Date picker changed: %s", date.FormatDate()));
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnToday(wxCommandEvent& event)
|
||
|
|
{
|
||
|
|
m_calendar->SetDate(wxDateTime::Today());
|
||
|
|
m_datePicker->SetValue(wxDateTime::Today());
|
||
|
|
Log("Navigated to today");
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnPrevMonth(wxCommandEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = m_calendar->GetDate();
|
||
|
|
date -= wxDateSpan::Month();
|
||
|
|
m_calendar->SetDate(date);
|
||
|
|
Log(wxString::Format("Previous month: %s", date.FormatDate()));
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnNextMonth(wxCommandEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = m_calendar->GetDate();
|
||
|
|
date += wxDateSpan::Month();
|
||
|
|
m_calendar->SetDate(date);
|
||
|
|
Log(wxString::Format("Next month: %s", date.FormatDate()));
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnPrevYear(wxCommandEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = m_calendar->GetDate();
|
||
|
|
date -= wxDateSpan::Year();
|
||
|
|
m_calendar->SetDate(date);
|
||
|
|
Log(wxString::Format("Previous year: %d", date.GetYear()));
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnNextYear(wxCommandEvent& event)
|
||
|
|
{
|
||
|
|
wxDateTime date = m_calendar->GetDate();
|
||
|
|
date += wxDateSpan::Year();
|
||
|
|
m_calendar->SetDate(date);
|
||
|
|
Log(wxString::Format("Next year: %d", date.GetYear()));
|
||
|
|
UpdateSelectedLabel();
|
||
|
|
}
|
||
|
|
|
||
|
|
wxCalendarCtrl* m_calendar;
|
||
|
|
wxDatePickerCtrl* m_datePicker;
|
||
|
|
wxStaticText* m_selectedLabel;
|
||
|
|
wxTextCtrl* m_log;
|
||
|
|
};
|
||
|
|
|
||
|
|
class CalendarApp : public wxApp
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
virtual bool OnInit() override
|
||
|
|
{
|
||
|
|
CalendarFrame* frame = new CalendarFrame();
|
||
|
|
frame->Show();
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
wxIMPLEMENT_APP(CalendarApp);
|