| /**************************************************************************** |
| ** |
| ** Copyright (C) 2017 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #include "calendar.h" |
| |
| #include <QComboBox> |
| #include <QGridLayout> |
| #include <QGroupBox> |
| #include <QCalendarWidget> |
| #include <QLabel> |
| #include <QDateEdit> |
| #include <QCheckBox> |
| #include <QTextCharFormat> |
| |
| CalendarWidget::CalendarWidget() |
| { |
| createPreviewGroupBox(); |
| createGeneralOptionsGroupBox(); |
| createDatesGroupBox(); |
| createTextFormatsGroupBox(); |
| |
| QGridLayout *layout = new QGridLayout; |
| layout->addWidget(previewGroupBox, 0, 0); |
| layout->addWidget(generalOptionsGroupBox, 0, 1); |
| layout->addWidget(datesGroupBox, 1, 0); |
| layout->addWidget(textFormatsGroupBox, 1, 1); |
| layout->setSizeConstraint(QLayout::SetFixedSize); |
| setLayout(layout); |
| |
| previewLayout->setRowMinimumHeight(0, calendar->sizeHint().height()); |
| previewLayout->setColumnMinimumWidth(0, calendar->sizeHint().width()); |
| |
| setWindowTitle(tr("Calendar Widget")); |
| } |
| |
| void CalendarWidget::localeChanged(QLocale locale) |
| { |
| calendar->setLocale(locale); |
| firstDayCombo->setCurrentIndex(locale.firstDayOfWeek()-1); |
| updateWeekendDays(); |
| } |
| |
| void CalendarWidget::firstDayChanged(int index) |
| { |
| calendar->setFirstDayOfWeek(Qt::DayOfWeek( |
| firstDayCombo->itemData(index).toInt())); |
| } |
| |
| void CalendarWidget::selectionModeChanged(int index) |
| { |
| calendar->setSelectionMode(QCalendarWidget::SelectionMode( |
| selectionModeCombo->itemData(index).toInt())); |
| } |
| |
| void CalendarWidget::horizontalHeaderChanged(int index) |
| { |
| calendar->setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat( |
| horizontalHeaderCombo->itemData(index).toInt())); |
| } |
| |
| void CalendarWidget::verticalHeaderChanged(int index) |
| { |
| calendar->setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat( |
| verticalHeaderCombo->itemData(index).toInt())); |
| } |
| |
| void CalendarWidget::selectedDateChanged() |
| { |
| currentDateEdit->setDate(calendar->selectedDate()); |
| } |
| |
| void CalendarWidget::minimumDateChanged(const QDate &date) |
| { |
| calendar->setMinimumDate(date); |
| maximumDateEdit->setDate(calendar->maximumDate()); |
| } |
| |
| void CalendarWidget::maximumDateChanged(const QDate &date) |
| { |
| calendar->setMaximumDate(date); |
| minimumDateEdit->setDate(calendar->minimumDate()); |
| } |
| |
| bool CalendarWidget::isWeekendDay(Qt::DayOfWeek day) { |
| QList<Qt::DayOfWeek> week = calendar->locale().weekdays(); |
| return !week.contains(day); |
| } |
| |
| void CalendarWidget::updateWeekendDays() { |
| QTextCharFormat weekFormat, weekendFormat; |
| weekFormat.setForeground(qvariant_cast<QColor>( |
| weekdayColorCombo->itemData(weekdayColorCombo->currentIndex()))); |
| weekendFormat.setForeground(qvariant_cast<QColor>( |
| weekendColorCombo->itemData(weekendColorCombo->currentIndex()))); |
| |
| calendar->setWeekdayTextFormat(Qt::Monday, isWeekendDay(Qt::Monday) ? weekendFormat : weekFormat); |
| calendar->setWeekdayTextFormat(Qt::Tuesday, isWeekendDay(Qt::Tuesday) ? weekendFormat : weekFormat); |
| calendar->setWeekdayTextFormat(Qt::Wednesday, isWeekendDay(Qt::Wednesday) ? weekendFormat : weekFormat); |
| calendar->setWeekdayTextFormat(Qt::Thursday, isWeekendDay(Qt::Thursday) ? weekendFormat : weekFormat); |
| calendar->setWeekdayTextFormat(Qt::Friday, isWeekendDay(Qt::Friday) ? weekendFormat : weekFormat); |
| calendar->setWeekdayTextFormat(Qt::Saturday, isWeekendDay(Qt::Saturday) ? weekendFormat : weekFormat); |
| calendar->setWeekdayTextFormat(Qt::Sunday, isWeekendDay(Qt::Sunday) ? weekendFormat : weekFormat); |
| } |
| |
| void CalendarWidget::weekdayFormatChanged() |
| { |
| updateWeekendDays(); |
| } |
| |
| void CalendarWidget::weekendFormatChanged() |
| { |
| updateWeekendDays(); |
| } |
| |
| void CalendarWidget::reformatHeaders() |
| { |
| QString text = headerTextFormatCombo->currentText(); |
| QTextCharFormat format; |
| |
| if (text == tr("Bold")) { |
| format.setFontWeight(QFont::Bold); |
| } else if (text == tr("Italic")) { |
| format.setFontItalic(true); |
| } else if (text == tr("Green")) { |
| format.setForeground(Qt::green); |
| } |
| calendar->setHeaderTextFormat(format); |
| } |
| |
| void CalendarWidget::reformatCalendarPage() |
| { |
| if (firstFridayCheckBox->isChecked()) { |
| QDate firstFriday(calendar->yearShown(), calendar->monthShown(), 1); |
| while (firstFriday.dayOfWeek() != Qt::Friday) |
| firstFriday = firstFriday.addDays(1); |
| QTextCharFormat firstFridayFormat; |
| firstFridayFormat.setForeground(Qt::blue); |
| calendar->setDateTextFormat(firstFriday, firstFridayFormat); |
| } |
| |
| //May First in Red takes precedence |
| if (mayFirstCheckBox->isChecked()) { |
| const QDate mayFirst(calendar->yearShown(), 5, 1); |
| QTextCharFormat mayFirstFormat; |
| mayFirstFormat.setForeground(Qt::red); |
| calendar->setDateTextFormat(mayFirst, mayFirstFormat); |
| } |
| } |
| |
| void CalendarWidget::createPreviewGroupBox() |
| { |
| previewGroupBox = new QGroupBox(tr("Preview")); |
| |
| calendar = new QCalendarWidget; |
| calendar->setMinimumDate(QDate(1900, 1, 1)); |
| calendar->setMaximumDate(QDate(3000, 1, 1)); |
| calendar->setGridVisible(true); |
| |
| connect(calendar, SIGNAL(currentPageChanged(int,int)), |
| this, SLOT(reformatCalendarPage())); |
| |
| previewLayout = new QGridLayout; |
| previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter); |
| previewGroupBox->setLayout(previewLayout); |
| } |
| |
| void CalendarWidget::createGeneralOptionsGroupBox() |
| { |
| generalOptionsGroupBox = new QGroupBox(tr("General Options")); |
| |
| firstDayCombo = new QComboBox; |
| firstDayCombo->addItem(tr("Monday"), Qt::Monday); |
| firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday); |
| firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday); |
| firstDayCombo->addItem(tr("Thursday"), Qt::Thursday); |
| firstDayCombo->addItem(tr("Friday"), Qt::Friday); |
| firstDayCombo->addItem(tr("Saturday"), Qt::Saturday); |
| firstDayCombo->addItem(tr("Sunday"), Qt::Sunday); |
| |
| firstDayLabel = new QLabel(tr("Wee&k starts on:")); |
| firstDayLabel->setBuddy(firstDayCombo); |
| |
| selectionModeCombo = new QComboBox; |
| selectionModeCombo->addItem(tr("Single selection"), |
| QCalendarWidget::SingleSelection); |
| selectionModeCombo->addItem(tr("None"), QCalendarWidget::NoSelection); |
| |
| selectionModeLabel = new QLabel(tr("&Selection mode:")); |
| selectionModeLabel->setBuddy(selectionModeCombo); |
| |
| gridCheckBox = new QCheckBox(tr("&Grid")); |
| gridCheckBox->setChecked(calendar->isGridVisible()); |
| |
| navigationCheckBox = new QCheckBox(tr("&Navigation bar")); |
| navigationCheckBox->setChecked(true); |
| |
| horizontalHeaderCombo = new QComboBox; |
| horizontalHeaderCombo->addItem(tr("Single letter day names"), |
| QCalendarWidget::SingleLetterDayNames); |
| horizontalHeaderCombo->addItem(tr("Short day names"), |
| QCalendarWidget::ShortDayNames); |
| horizontalHeaderCombo->addItem(tr("None"), |
| QCalendarWidget::NoHorizontalHeader); |
| horizontalHeaderCombo->setCurrentIndex(1); |
| |
| horizontalHeaderLabel = new QLabel(tr("&Horizontal header:")); |
| horizontalHeaderLabel->setBuddy(horizontalHeaderCombo); |
| |
| verticalHeaderCombo = new QComboBox; |
| verticalHeaderCombo->addItem(tr("ISO week numbers"), |
| QCalendarWidget::ISOWeekNumbers); |
| verticalHeaderCombo->addItem(tr("None"), QCalendarWidget::NoVerticalHeader); |
| |
| verticalHeaderLabel = new QLabel(tr("&Vertical header:")); |
| verticalHeaderLabel->setBuddy(verticalHeaderCombo); |
| |
| connect(firstDayCombo, SIGNAL(currentIndexChanged(int)), |
| this, SLOT(firstDayChanged(int))); |
| connect(selectionModeCombo, SIGNAL(currentIndexChanged(int)), |
| this, SLOT(selectionModeChanged(int))); |
| connect(gridCheckBox, SIGNAL(toggled(bool)), |
| calendar, SLOT(setGridVisible(bool))); |
| connect(navigationCheckBox, SIGNAL(toggled(bool)), |
| calendar, SLOT(setNavigationBarVisible(bool))); |
| connect(horizontalHeaderCombo, SIGNAL(currentIndexChanged(int)), |
| this, SLOT(horizontalHeaderChanged(int))); |
| connect(verticalHeaderCombo, SIGNAL(currentIndexChanged(int)), |
| this, SLOT(verticalHeaderChanged(int))); |
| |
| QHBoxLayout *checkBoxLayout = new QHBoxLayout; |
| checkBoxLayout->addWidget(gridCheckBox); |
| checkBoxLayout->addStretch(); |
| checkBoxLayout->addWidget(navigationCheckBox); |
| |
| QGridLayout *outerLayout = new QGridLayout; |
| outerLayout->addWidget(firstDayLabel, 0, 0); |
| outerLayout->addWidget(firstDayCombo, 0, 1); |
| outerLayout->addWidget(selectionModeLabel, 1, 0); |
| outerLayout->addWidget(selectionModeCombo, 1, 1); |
| outerLayout->addLayout(checkBoxLayout, 2, 0, 1, 2); |
| outerLayout->addWidget(horizontalHeaderLabel, 3, 0); |
| outerLayout->addWidget(horizontalHeaderCombo, 3, 1); |
| outerLayout->addWidget(verticalHeaderLabel, 4, 0); |
| outerLayout->addWidget(verticalHeaderCombo, 4, 1); |
| generalOptionsGroupBox->setLayout(outerLayout); |
| |
| firstDayChanged(firstDayCombo->currentIndex()); |
| selectionModeChanged(selectionModeCombo->currentIndex()); |
| horizontalHeaderChanged(horizontalHeaderCombo->currentIndex()); |
| verticalHeaderChanged(verticalHeaderCombo->currentIndex()); |
| } |
| |
| void CalendarWidget::createDatesGroupBox() |
| { |
| datesGroupBox = new QGroupBox(tr("Dates")); |
| |
| minimumDateEdit = new QDateEdit; |
| minimumDateEdit->setDisplayFormat("MMM d yyyy"); |
| minimumDateEdit->setDateRange(calendar->minimumDate(), |
| calendar->maximumDate()); |
| minimumDateEdit->setDate(calendar->minimumDate()); |
| |
| minimumDateLabel = new QLabel(tr("&Minimum Date:")); |
| minimumDateLabel->setBuddy(minimumDateEdit); |
| |
| currentDateEdit = new QDateEdit; |
| currentDateEdit->setDisplayFormat("MMM d yyyy"); |
| currentDateEdit->setDate(calendar->selectedDate()); |
| currentDateEdit->setDateRange(calendar->minimumDate(), |
| calendar->maximumDate()); |
| |
| currentDateLabel = new QLabel(tr("&Current Date:")); |
| currentDateLabel->setBuddy(currentDateEdit); |
| |
| maximumDateEdit = new QDateEdit; |
| maximumDateEdit->setDisplayFormat("MMM d yyyy"); |
| maximumDateEdit->setDateRange(calendar->minimumDate(), |
| calendar->maximumDate()); |
| maximumDateEdit->setDate(calendar->maximumDate()); |
| |
| maximumDateLabel = new QLabel(tr("Ma&ximum Date:")); |
| maximumDateLabel->setBuddy(maximumDateEdit); |
| |
| connect(currentDateEdit, SIGNAL(dateChanged(QDate)), |
| calendar, SLOT(setSelectedDate(QDate))); |
| connect(calendar, SIGNAL(selectionChanged()), |
| this, SLOT(selectedDateChanged())); |
| connect(minimumDateEdit, SIGNAL(dateChanged(QDate)), |
| this, SLOT(minimumDateChanged(QDate))); |
| connect(maximumDateEdit, SIGNAL(dateChanged(QDate)), |
| this, SLOT(maximumDateChanged(QDate))); |
| |
| QGridLayout *dateBoxLayout = new QGridLayout; |
| dateBoxLayout->addWidget(currentDateLabel, 1, 0); |
| dateBoxLayout->addWidget(currentDateEdit, 1, 1); |
| dateBoxLayout->addWidget(minimumDateLabel, 0, 0); |
| dateBoxLayout->addWidget(minimumDateEdit, 0, 1); |
| dateBoxLayout->addWidget(maximumDateLabel, 2, 0); |
| dateBoxLayout->addWidget(maximumDateEdit, 2, 1); |
| dateBoxLayout->setRowStretch(3, 1); |
| |
| datesGroupBox->setLayout(dateBoxLayout); |
| } |
| |
| void CalendarWidget::createTextFormatsGroupBox() |
| { |
| textFormatsGroupBox = new QGroupBox(tr("Text Formats")); |
| |
| weekdayColorCombo = createColorComboBox(); |
| weekdayColorCombo->setCurrentIndex( |
| weekdayColorCombo->findText(tr("Black"))); |
| |
| weekdayColorLabel = new QLabel(tr("&Weekday color:")); |
| weekdayColorLabel->setBuddy(weekdayColorCombo); |
| |
| weekendColorCombo = createColorComboBox(); |
| weekendColorCombo->setCurrentIndex( |
| weekendColorCombo->findText(tr("Red"))); |
| |
| weekendColorLabel = new QLabel(tr("Week&end color:")); |
| weekendColorLabel->setBuddy(weekendColorCombo); |
| |
| headerTextFormatCombo = new QComboBox; |
| headerTextFormatCombo->addItem(tr("Bold")); |
| headerTextFormatCombo->addItem(tr("Italic")); |
| headerTextFormatCombo->addItem(tr("Plain")); |
| |
| headerTextFormatLabel = new QLabel(tr("&Header text:")); |
| headerTextFormatLabel->setBuddy(headerTextFormatCombo); |
| |
| firstFridayCheckBox = new QCheckBox(tr("&First Friday in blue")); |
| |
| mayFirstCheckBox = new QCheckBox(tr("May &1 in red")); |
| |
| connect(weekdayColorCombo, SIGNAL(currentIndexChanged(int)), |
| this, SLOT(weekdayFormatChanged())); |
| connect(weekendColorCombo, SIGNAL(currentIndexChanged(int)), |
| this, SLOT(weekendFormatChanged())); |
| connect(headerTextFormatCombo, SIGNAL(currentIndexChanged(QString)), |
| this, SLOT(reformatHeaders())); |
| connect(firstFridayCheckBox, SIGNAL(toggled(bool)), |
| this, SLOT(reformatCalendarPage())); |
| connect(mayFirstCheckBox, SIGNAL(toggled(bool)), |
| this, SLOT(reformatCalendarPage())); |
| |
| QHBoxLayout *checkBoxLayout = new QHBoxLayout; |
| checkBoxLayout->addWidget(firstFridayCheckBox); |
| checkBoxLayout->addStretch(); |
| checkBoxLayout->addWidget(mayFirstCheckBox); |
| |
| QGridLayout *outerLayout = new QGridLayout; |
| outerLayout->addWidget(weekdayColorLabel, 0, 0); |
| outerLayout->addWidget(weekdayColorCombo, 0, 1); |
| outerLayout->addWidget(weekendColorLabel, 1, 0); |
| outerLayout->addWidget(weekendColorCombo, 1, 1); |
| outerLayout->addWidget(headerTextFormatLabel, 2, 0); |
| outerLayout->addWidget(headerTextFormatCombo, 2, 1); |
| outerLayout->addLayout(checkBoxLayout, 3, 0, 1, 2); |
| textFormatsGroupBox->setLayout(outerLayout); |
| |
| weekdayFormatChanged(); |
| weekendFormatChanged(); |
| reformatHeaders(); |
| reformatCalendarPage(); |
| } |
| |
| QComboBox *CalendarWidget::createColorComboBox() |
| { |
| QComboBox *comboBox = new QComboBox; |
| comboBox->addItem(tr("Red"), QColor(Qt::red)); |
| comboBox->addItem(tr("Blue"), QColor(Qt::blue)); |
| comboBox->addItem(tr("Black"), QColor(Qt::black)); |
| comboBox->addItem(tr("Magenta"), QColor(Qt::magenta)); |
| return comboBox; |
| } |