File indexing completed on 2025-02-16 04:54:20

0001 /*
0002   This file is part of KOrganizer.
0003 
0004   SPDX-FileCopyrightText: 2000-2003 Cornelius Schumacher <schumacher@kde.org>
0005   SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
0006 
0007   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0008 */
0009 #include "koprefsdialogtime.h"
0010 #include "koglobals.h"
0011 #include "koprefs.h"
0012 #include <CalendarSupport/KCalPrefs>
0013 #include <KComboBox>
0014 #include <KHolidays/HolidayRegion>
0015 #include <KLocalizedString>
0016 #include <KPluginFactory>
0017 #include <KTimeComboBox>
0018 #include <KUrlRequester>
0019 #include <Libkdepim/KCheckComboBox>
0020 #include <QCheckBox>
0021 #include <QComboBox>
0022 #include <QFrame>
0023 #include <QGroupBox>
0024 #include <QLabel>
0025 #include <QSpinBox>
0026 #include <QTabWidget>
0027 #include <QTimeEdit>
0028 #include <QVBoxLayout>
0029 
0030 K_PLUGIN_CLASS_WITH_JSON(KOPrefsDialogTime, "korganizer_configtime.json")
0031 
0032 KOPrefsDialogTime::KOPrefsDialogTime(QObject *parent, const KPluginMetaData &data)
0033     : Korganizer::KPrefsModule(KOPrefs::instance(), parent, data)
0034 {
0035     auto layout = new QVBoxLayout(widget());
0036     layout->setContentsMargins({});
0037     auto tabWidget = new QTabWidget(widget());
0038     tabWidget->setDocumentMode(true);
0039     layout->addWidget(tabWidget);
0040 
0041     auto regionalPage = new QFrame(widget());
0042     tabWidget->addTab(regionalPage, QIcon::fromTheme(QStringLiteral("flag")), i18nc("@title:tab", "Regional"));
0043 
0044     auto regionalLayout = new QGridLayout(regionalPage);
0045 
0046     auto datetimeGroupBox = new QGroupBox(i18nc("@title:group", "General Time and Date"), regionalPage);
0047     regionalLayout->addWidget(datetimeGroupBox, 0, 0);
0048 
0049     auto datetimeLayout = new QGridLayout(datetimeGroupBox);
0050 
0051     Korganizer::KPrefsWidTime *dayBegins = addWidTime(KOPrefs::instance()->dayBeginsItem(), regionalPage);
0052     datetimeLayout->addWidget(dayBegins->label(), 1, 0);
0053     datetimeLayout->addWidget(dayBegins->timeEdit(), 1, 1);
0054 
0055     auto holidaysGroupBox = new QGroupBox(i18nc("@title:group", "Holidays"), regionalPage);
0056     regionalLayout->addWidget(holidaysGroupBox, 1, 0);
0057 
0058     auto holidaysLayout = new QGridLayout(holidaysGroupBox);
0059 
0060     // holiday region selection
0061     auto holidayRegBox = new QWidget(regionalPage);
0062     auto holidayRegBoxHBoxLayout = new QHBoxLayout(holidayRegBox);
0063     holidayRegBoxHBoxLayout->setContentsMargins({});
0064     holidaysLayout->addWidget(holidayRegBox, 1, 0, 1, 2);
0065 
0066     auto holidayLabel = new QLabel(i18nc("@label", "Use holiday region:"), holidayRegBox);
0067     holidayLabel->setToolTip(KOPrefs::instance()->holidaysItem()->toolTip());
0068     holidayLabel->setWhatsThis(KOPrefs::instance()->holidaysItem()->whatsThis());
0069 
0070     mHolidayCheckCombo = new KPIM::KCheckComboBox(holidayRegBox);
0071     holidayRegBoxHBoxLayout->addWidget(mHolidayCheckCombo);
0072     connect(mHolidayCheckCombo, &KPIM::KCheckComboBox::checkedItemsChanged, this, &KOPrefsDialogTime::slotWidChanged);
0073 
0074     mHolidayCheckCombo->setToolTip(KOPrefs::instance()->holidaysItem()->toolTip());
0075     mHolidayCheckCombo->setWhatsThis(KOPrefs::instance()->holidaysItem()->whatsThis());
0076 
0077     const QStringList regions = KHolidays::HolidayRegion::regionCodes();
0078     std::vector<std::pair<QString, QString>> regionsMap;
0079     regionsMap.reserve(regions.size());
0080 
0081     for (const QString &regionCode : regions) {
0082         const QString name = KHolidays::HolidayRegion::name(regionCode);
0083         const QLocale locale(KHolidays::HolidayRegion::languageCode(regionCode));
0084         const QString languageName = QLocale::languageToString(locale.language());
0085         QString label;
0086         if (languageName.isEmpty()) {
0087             label = name;
0088         } else {
0089             label = i18nc("@item:inlistbox Holiday region, region language", "%1 (%2)", name, languageName);
0090         }
0091         regionsMap.emplace_back(label, regionCode);
0092     }
0093     std::sort(regionsMap.begin(), regionsMap.end(), [](const auto &lhs, const auto &rhs) {
0094         return lhs.first < rhs.first;
0095     });
0096 
0097     mHolidayCheckCombo->clear();
0098     mHolidayCheckCombo->setDefaultText(i18nc("@item:inlistbox", "Select Holiday Regions"));
0099     for (const auto &entry : regionsMap) {
0100         mHolidayCheckCombo->addItem(entry.first, entry.second);
0101     }
0102 
0103     // QString regionStr = KHolidays::HolidayRegion::defaultRegionCode();
0104     const auto holidays = KOGlobals::self()->holidays();
0105     for (KHolidays::HolidayRegion *region : holidays) {
0106         const QString regionStr = region->regionCode();
0107         mHolidayCheckCombo->setItemCheckState(mHolidayCheckCombo->findData(regionStr), Qt::Checked);
0108     }
0109 
0110     auto workingHoursGroupBox = new QGroupBox(i18nc("@title:group", "Working Period"), regionalPage);
0111     regionalLayout->addWidget(workingHoursGroupBox, 2, 0);
0112 
0113     QBoxLayout *workingHoursLayout = new QVBoxLayout(workingHoursGroupBox);
0114 
0115     QBoxLayout *workDaysLayout = new QHBoxLayout;
0116     workingHoursLayout->addLayout(workDaysLayout);
0117 
0118     // Respect start of week setting
0119     int weekStart = QLocale().firstDayOfWeek();
0120     for (int i = 0; i < 7; ++i) {
0121         QString weekDayName = QLocale().dayName((i + weekStart + 6) % 7 + 1, QLocale::ShortFormat);
0122         int index = (i + weekStart + 6) % 7;
0123         mWorkDays[index] = new QCheckBox(weekDayName);
0124         mWorkDays[index]->setWhatsThis(i18nc("@info:whatsthis",
0125                                              "Check this box to make KOrganizer mark the "
0126                                              "working hours for this day of the week. "
0127                                              "If this is a work day for you, check "
0128                                              "this box, or the working hours will not be "
0129                                              "marked with color."));
0130 
0131         connect(mWorkDays[index], &QCheckBox::stateChanged, this, &Korganizer::KPrefsModule::slotWidChanged);
0132 
0133         workDaysLayout->addWidget(mWorkDays[index]);
0134     }
0135 
0136     Korganizer::KPrefsWidCombo *firstDayCombo = addWidCombo(KOPrefs::instance()->weekStartDayItem(), workingHoursGroupBox);
0137     auto firstDayLayout = new QHBoxLayout;
0138     workingHoursLayout->addLayout(firstDayLayout);
0139     QStringList days;
0140     days << i18nc("@item:inlistbox", "Monday") << i18nc("@item:inlistbox", "Tuesday") << i18nc("@item:inlistbox", "Wednesday")
0141          << i18nc("@item:inlistbox", "Thursday") << i18nc("@item:inlistbox", "Friday") << i18nc("@item:inlistbox", "Saturday")
0142          << i18nc("@item:inlistbox", "Sunday");
0143     firstDayCombo->comboBox()->addItems(days);
0144 
0145     firstDayLayout->addWidget(firstDayCombo->label());
0146     firstDayLayout->addWidget(firstDayCombo->comboBox());
0147 
0148     Korganizer::KPrefsWidTime *workStart = addWidTime(KOPrefs::instance()->workingHoursStartItem());
0149 
0150     auto workStartLayout = new QHBoxLayout;
0151     workingHoursLayout->addLayout(workStartLayout);
0152 
0153     workStartLayout->addWidget(workStart->label());
0154     workStartLayout->addWidget(workStart->timeEdit());
0155 
0156     Korganizer::KPrefsWidTime *workEnd = addWidTime(KOPrefs::instance()->workingHoursEndItem());
0157 
0158     auto workEndLayout = new QHBoxLayout;
0159     workingHoursLayout->addLayout(workEndLayout);
0160 
0161     workEndLayout->addWidget(workEnd->label());
0162     workEndLayout->addWidget(workEnd->timeEdit());
0163 
0164     Korganizer::KPrefsWidBool *excludeHolidays = addWidBool(KOPrefs::instance()->excludeHolidaysItem());
0165 
0166     workingHoursLayout->addWidget(excludeHolidays->checkBox());
0167 
0168     regionalLayout->setRowStretch(4, 1);
0169 
0170     auto defaultPage = new QFrame(widget());
0171     tabWidget->addTab(defaultPage, QIcon::fromTheme(QStringLiteral("draw-eraser")), i18nc("@title:tab", "Default Values"));
0172     auto defaultLayout = new QGridLayout(defaultPage);
0173 
0174     auto timesGroupBox = new QGroupBox(i18nc("@title:group", "Appointments"), defaultPage);
0175     defaultLayout->addWidget(timesGroupBox, 0, 0);
0176 
0177     auto timesLayout = new QGridLayout(timesGroupBox);
0178 
0179     Korganizer::KPrefsWidTime *defaultTime = addWidTime(CalendarSupport::KCalPrefs::instance()->startTimeItem(), defaultPage);
0180     timesLayout->addWidget(defaultTime->label(), 0, 0);
0181     timesLayout->addWidget(defaultTime->timeEdit(), 0, 1);
0182 
0183     Korganizer::KPrefsWidDuration *defaultDuration =
0184         addWidDuration(CalendarSupport::KCalPrefs::instance()->defaultDurationItem(), QStringLiteral("hh:mm"), defaultPage);
0185 
0186     timesLayout->addWidget(defaultDuration->label(), 1, 0);
0187     timesLayout->addWidget(defaultDuration->timeEdit(), 1, 1);
0188 
0189     auto remindersGroupBox = new QGroupBox(i18nc("@title:group", "Reminders"), defaultPage);
0190     defaultLayout->addWidget(remindersGroupBox, 1, 0);
0191 
0192     auto remindersLayout = new QGridLayout(remindersGroupBox);
0193 
0194     auto reminderLabel = new QLabel(i18nc("@label", "Default reminder time:"), defaultPage);
0195     remindersLayout->addWidget(reminderLabel, 0, 0);
0196     reminderLabel->setWhatsThis(CalendarSupport::KCalPrefs::instance()->reminderTimeItem()->whatsThis());
0197     mReminderTimeSpin = new QSpinBox(defaultPage);
0198     mReminderTimeSpin->setWhatsThis(CalendarSupport::KCalPrefs::instance()->reminderTimeItem()->whatsThis());
0199     mReminderTimeSpin->setToolTip(CalendarSupport::KCalPrefs::instance()->reminderTimeItem()->toolTip());
0200     connect(mReminderTimeSpin, &QSpinBox::valueChanged, this, &KOPrefsDialogTime::slotWidChanged);
0201     remindersLayout->addWidget(mReminderTimeSpin, 0, 1);
0202 
0203     mReminderUnitsCombo = new KComboBox(defaultPage);
0204     mReminderUnitsCombo->setToolTip(CalendarSupport::KCalPrefs::instance()->reminderTimeUnitsItem()->toolTip());
0205     mReminderUnitsCombo->setWhatsThis(CalendarSupport::KCalPrefs::instance()->reminderTimeUnitsItem()->whatsThis());
0206     connect(mReminderUnitsCombo, &KComboBox::activated, this, &KOPrefsDialogTime::slotWidChanged);
0207     mReminderUnitsCombo->addItem(i18nc("@item:inlistbox reminder units in minutes", "minute(s)"));
0208     mReminderUnitsCombo->addItem(i18nc("@item:inlistbox reminder time units in hours", "hour(s)"));
0209     mReminderUnitsCombo->addItem(i18nc("@item:inlistbox reminder time units in days", "day(s)"));
0210     remindersLayout->addWidget(mReminderUnitsCombo, 0, 2);
0211 
0212     QCheckBox *cb = addWidBool(CalendarSupport::KCalPrefs::instance()->defaultAudioFileRemindersItem())->checkBox();
0213 
0214     if (CalendarSupport::KCalPrefs::instance()->audioFilePathItem()->value().isEmpty()) {
0215         const QString defAudioFile =
0216             QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("sound/") + QLatin1StringView("KDE-Sys-Warning.ogg"));
0217         CalendarSupport::KCalPrefs::instance()->audioFilePathItem()->setValue(defAudioFile);
0218     }
0219     QString filter = i18n("Audio Files (*.ogg *.wav *.mp3 *.wma *.flac *.aiff *.raw *.au *.ra)");
0220     KUrlRequester *rq = addWidPath(CalendarSupport::KCalPrefs::instance()->audioFilePathItem(), nullptr, filter)->urlRequester();
0221     rq->setEnabled(cb->isChecked());
0222 
0223     connect(cb, &QCheckBox::toggled, rq, &KUrlRequester::setEnabled);
0224 
0225     auto audioFileRemindersBox = new QVBoxLayout;
0226     audioFileRemindersBox->addWidget(cb);
0227     audioFileRemindersBox->addWidget(rq);
0228 
0229     remindersLayout->addLayout(audioFileRemindersBox, 1, 0);
0230     remindersLayout->addWidget(addWidBool(CalendarSupport::KCalPrefs::instance()->defaultEventRemindersItem())->checkBox(), 2, 0);
0231     remindersLayout->addWidget(addWidBool(CalendarSupport::KCalPrefs::instance()->defaultTodoRemindersItem())->checkBox(), 3, 0);
0232 
0233     defaultLayout->setRowStretch(3, 1);
0234     load();
0235 }
0236 
0237 void KOPrefsDialogTime::usrReadConfig()
0238 {
0239     mReminderTimeSpin->setValue(CalendarSupport::KCalPrefs::instance()->mReminderTime);
0240     mReminderUnitsCombo->setCurrentIndex(CalendarSupport::KCalPrefs::instance()->mReminderTimeUnits);
0241     for (int i = 0; i < 7; ++i) {
0242         mWorkDays[i]->setChecked((1 << i) & (KOPrefs::instance()->mWorkWeekMask));
0243     }
0244 }
0245 
0246 void KOPrefsDialogTime::usrWriteConfig()
0247 {
0248     QStringList HolidayRegions;
0249     const auto checkedItems = mHolidayCheckCombo->checkedItems();
0250     for (const QString &str : checkedItems) {
0251         int index = mHolidayCheckCombo->findText(str);
0252         if (index >= 0) {
0253             HolidayRegions.append(mHolidayCheckCombo->itemData(index).toString());
0254         }
0255     }
0256     KOPrefs::instance()->mHolidays = HolidayRegions;
0257 
0258     CalendarSupport::KCalPrefs::instance()->mReminderTime = mReminderTimeSpin->value();
0259     CalendarSupport::KCalPrefs::instance()->mReminderTimeUnits = mReminderUnitsCombo->currentIndex();
0260 
0261     int mask = 0;
0262     for (int i = 0; i < 7; ++i) {
0263         if (mWorkDays[i]->isChecked()) {
0264             mask = mask | (1 << i);
0265         }
0266     }
0267     KOPrefs::instance()->mWorkWeekMask = mask;
0268     KOPrefs::instance()->save();
0269     CalendarSupport::KCalPrefs::instance()->save();
0270 }
0271 
0272 void KOPrefsDialogTime::setCombo(KComboBox *combo, const QString &text, const QStringList *tags)
0273 {
0274     if (tags) {
0275         int i = tags->indexOf(text);
0276         if (i > 0) {
0277             combo->setCurrentIndex(i);
0278         }
0279     } else {
0280         const int numberOfElements{combo->count()};
0281         for (int i = 0; i < numberOfElements; ++i) {
0282             if (combo->itemText(i) == text) {
0283                 combo->setCurrentIndex(i);
0284                 break;
0285             }
0286         }
0287     }
0288 }
0289 
0290 #include "koprefsdialogtime.moc"