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 ®ionCode : 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"