File indexing completed on 2024-05-12 05:13:28
0001 /* 0002 SPDX-FileCopyrightText: 2001, 2003 Cornelius Schumacher <schumacher@kde.org> 0003 SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> 0004 SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.net> 0005 SPDX-FileContributor: Kevin Krammer <krake@kdab.com> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0 0008 */ 0009 #include "prefs.h" 0010 #include "prefs_base.h" 0011 0012 #include "calendarview_debug.h" 0013 0014 #include <Akonadi/AttributeFactory> 0015 #include <Akonadi/CollectionColorAttribute> 0016 0017 #include <QFontDatabase> 0018 #include <QRandomGenerator> 0019 using namespace EventViews; 0020 0021 QSet<EventViews::EventView::ItemIcon> iconArrayToSet(const QByteArray &array) 0022 { 0023 QSet<EventViews::EventView::ItemIcon> set; 0024 for (int i = 0; i < array.size(); ++i) { 0025 if (i >= EventViews::EventView::IconCount) { 0026 qCWarning(CALENDARVIEW_LOG) << "Icon array is too big: " << array.size(); 0027 return set; 0028 } 0029 if (array[i] != 0) { 0030 set.insert(static_cast<EventViews::EventView::ItemIcon>(i)); 0031 } 0032 } 0033 return set; 0034 } 0035 0036 QByteArray iconSetToArray(const QSet<EventViews::EventView::ItemIcon> &set) 0037 { 0038 QByteArray array; 0039 for (int i = 0; i < EventViews::EventView::IconCount; ++i) { 0040 const bool contains = set.contains(static_cast<EventViews::EventView::ItemIcon>(i)); 0041 array.append(contains ? 1 : 0); 0042 } 0043 0044 return array; 0045 } 0046 0047 QByteArray agendaViewIconDefaults() 0048 { 0049 QByteArray iconDefaults; 0050 iconDefaults.resize(7); 0051 0052 iconDefaults[EventViews::EventView::CalendarCustomIcon] = 1; 0053 iconDefaults[EventViews::EventView::TaskIcon] = 1; 0054 iconDefaults[EventViews::EventView::JournalIcon] = 1; 0055 iconDefaults[EventViews::EventView::RecurringIcon] = 1; 0056 iconDefaults[EventViews::EventView::ReminderIcon] = 1; 0057 iconDefaults[EventViews::EventView::ReadOnlyIcon] = 1; 0058 iconDefaults[EventViews::EventView::ReplyIcon] = 0; 0059 0060 return iconDefaults; 0061 } 0062 0063 QByteArray monthViewIconDefaults() 0064 { 0065 QByteArray iconDefaults; 0066 iconDefaults.resize(7); 0067 0068 iconDefaults[EventViews::EventView::CalendarCustomIcon] = 1; 0069 iconDefaults[EventViews::EventView::TaskIcon] = 1; 0070 iconDefaults[EventViews::EventView::JournalIcon] = 1; 0071 iconDefaults[EventViews::EventView::RecurringIcon] = 0; 0072 iconDefaults[EventViews::EventView::ReminderIcon] = 0; 0073 iconDefaults[EventViews::EventView::ReadOnlyIcon] = 1; 0074 iconDefaults[EventViews::EventView::ReplyIcon] = 0; 0075 0076 return iconDefaults; 0077 } 0078 0079 class BaseConfig : public PrefsBase 0080 { 0081 public: 0082 BaseConfig(); 0083 0084 void setResourceColor(const QString &resource, const QColor &color); 0085 0086 void setTimeScaleTimezones(const QStringList &timeZones); 0087 QStringList timeScaleTimezones() const; 0088 0089 public: 0090 QHash<QString, QColor> mResourceColors; 0091 QColor mDefaultResourceColor; 0092 0093 QFont mDefaultMonthViewFont; 0094 QFont mDefaultAgendaTimeLabelsFont; 0095 0096 QStringList mTimeScaleTimeZones; 0097 0098 QSet<EventViews::EventView::ItemIcon> mAgendaViewIcons; 0099 QSet<EventViews::EventView::ItemIcon> mMonthViewIcons; 0100 0101 protected: 0102 void usrSetDefaults() override; 0103 void usrRead() override; 0104 bool usrSave() override; 0105 }; 0106 0107 BaseConfig::BaseConfig() 0108 : PrefsBase() 0109 { 0110 mDefaultResourceColor = QColor(); // Default is a color invalid 0111 0112 mDefaultAgendaTimeLabelsFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); 0113 // make a large default time bar font, at least 16 points. 0114 mDefaultAgendaTimeLabelsFont.setPointSize(qMax(mDefaultAgendaTimeLabelsFont.pointSize() + 4, 16)); 0115 0116 mDefaultMonthViewFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); 0117 // make it a bit smaller 0118 mDefaultMonthViewFont.setPointSize(qMax(mDefaultMonthViewFont.pointSize() - 2, 6)); 0119 0120 agendaTimeLabelsFontItem()->setDefaultValue(mDefaultAgendaTimeLabelsFont); 0121 agendaTimeLabelsFontItem()->setDefault(); 0122 monthViewFontItem()->setDefaultValue(mDefaultMonthViewFont); 0123 monthViewFontItem()->setDefault(); 0124 } 0125 0126 void BaseConfig::setResourceColor(const QString &resource, const QColor &color) 0127 { 0128 mResourceColors.insert(resource, color); 0129 } 0130 0131 void BaseConfig::setTimeScaleTimezones(const QStringList &list) 0132 { 0133 mTimeScaleTimeZones = list; 0134 } 0135 0136 QStringList BaseConfig::timeScaleTimezones() const 0137 { 0138 return mTimeScaleTimeZones; 0139 } 0140 0141 void BaseConfig::usrSetDefaults() 0142 { 0143 setAgendaTimeLabelsFont(mDefaultAgendaTimeLabelsFont); 0144 setMonthViewFont(mDefaultMonthViewFont); 0145 0146 PrefsBase::usrSetDefaults(); 0147 } 0148 0149 void BaseConfig::usrRead() 0150 { 0151 KConfigGroup rColorsConfig(config(), QStringLiteral("Resources Colors")); 0152 const QStringList colorKeyList = rColorsConfig.keyList(); 0153 0154 for (const QString &key : colorKeyList) { 0155 QColor color = rColorsConfig.readEntry(key, mDefaultResourceColor); 0156 // qCDebug(CALENDARVIEW_LOG) << "key:" << key << "value:" << color; 0157 setResourceColor(key, color); 0158 } 0159 0160 #if 0 0161 config()->setGroup("FreeBusy"); 0162 if (mRememberRetrievePw) { 0163 mRetrievePassword 0164 = KStringHandler::obscure(config()->readEntry("Retrieve Server Password")); 0165 } 0166 #endif 0167 0168 KConfigGroup timeScaleConfig(config(), QStringLiteral("Timescale")); 0169 setTimeScaleTimezones(timeScaleConfig.readEntry("Timescale Timezones", QStringList())); 0170 0171 KConfigGroup monthViewConfig(config(), QStringLiteral("Month View")); 0172 KConfigGroup agendaViewConfig(config(), QStringLiteral("Agenda View")); 0173 const auto agendaIconArray = agendaViewConfig.readEntry<QByteArray>("agendaViewItemIcons", agendaViewIconDefaults()); 0174 const auto monthIconArray = monthViewConfig.readEntry<QByteArray>("monthViewItemIcons", monthViewIconDefaults()); 0175 0176 mAgendaViewIcons = iconArrayToSet(agendaIconArray); 0177 mMonthViewIcons = iconArrayToSet(monthIconArray); 0178 0179 KConfigSkeleton::usrRead(); 0180 } 0181 0182 bool BaseConfig::usrSave() 0183 { 0184 KConfigGroup rColorsConfig(config(), QStringLiteral("Resources Colors")); 0185 for (auto it = mResourceColors.constBegin(); it != mResourceColors.constEnd(); ++it) { 0186 rColorsConfig.writeEntry(it.key(), it.value()); 0187 } 0188 0189 #if 0 0190 if (mRememberRetrievePw) { 0191 config()->writeEntry("Retrieve Server Password", 0192 KStringHandler::obscure(mRetrievePassword)); 0193 } else { 0194 config()->deleteEntry("Retrieve Server Password"); 0195 } 0196 #endif 0197 0198 KConfigGroup timeScaleConfig(config(), QStringLiteral("Timescale")); 0199 timeScaleConfig.writeEntry("Timescale Timezones", timeScaleTimezones()); 0200 0201 KConfigGroup monthViewConfig(config(), QStringLiteral("Month View")); 0202 KConfigGroup agendaViewConfig(config(), QStringLiteral("Agenda View")); 0203 0204 const QByteArray agendaIconArray = iconSetToArray(mAgendaViewIcons); 0205 const QByteArray monthIconArray = iconSetToArray(mMonthViewIcons); 0206 0207 agendaViewConfig.writeEntry<QByteArray>("agendaViewItemIcons", agendaIconArray); 0208 monthViewConfig.writeEntry<QByteArray>("monthViewItemIcons", monthIconArray); 0209 0210 return KConfigSkeleton::usrSave(); 0211 } 0212 0213 class EventViews::PrefsPrivate 0214 { 0215 public: 0216 explicit PrefsPrivate(Prefs *parent) 0217 : mAppConfig(nullptr) 0218 , q(parent) 0219 { 0220 } 0221 0222 PrefsPrivate(Prefs *parent, KCoreConfigSkeleton *appConfig) 0223 : mAppConfig(appConfig) 0224 , q(parent) 0225 { 0226 } 0227 0228 KConfigSkeletonItem *appConfigItem(const KConfigSkeletonItem *baseConfigItem) const; 0229 0230 void setBool(KCoreConfigSkeleton::ItemBool *baseConfigItem, bool value); 0231 bool getBool(const KCoreConfigSkeleton::ItemBool *baseConfigItem) const; 0232 0233 void setInt(KCoreConfigSkeleton::ItemInt *baseConfigItem, int value); 0234 int getInt(const KCoreConfigSkeleton::ItemInt *baseConfigItem) const; 0235 0236 void setString(KCoreConfigSkeleton::ItemString *baseConfigItem, const QString &value); 0237 QString getString(const KCoreConfigSkeleton::ItemString *baseConfigItem) const; 0238 0239 void setDateTime(KCoreConfigSkeleton::ItemDateTime *baseConfigItem, const QDateTime &value); 0240 QDateTime getDateTime(const KCoreConfigSkeleton::ItemDateTime *baseConfigItem) const; 0241 0242 void setStringList(KCoreConfigSkeleton::ItemStringList *baseConfigItem, const QStringList &value); 0243 QStringList getStringList(const KCoreConfigSkeleton::ItemStringList *baseConfigItem) const; 0244 0245 void setColor(KConfigSkeleton::ItemColor *baseConfigItem, const QColor &value); 0246 QColor getColor(const KConfigSkeleton::ItemColor *baseConfigItem) const; 0247 0248 void setFont(KConfigSkeleton::ItemFont *baseConfigItem, const QFont &value); 0249 QFont getFont(const KConfigSkeleton::ItemFont *baseConfigItem) const; 0250 0251 public: 0252 BaseConfig mBaseConfig; 0253 KCoreConfigSkeleton *mAppConfig = nullptr; 0254 0255 private: 0256 Prefs *q; 0257 }; 0258 0259 KConfigSkeletonItem *PrefsPrivate::appConfigItem(const KConfigSkeletonItem *baseConfigItem) const 0260 { 0261 Q_ASSERT(baseConfigItem); 0262 0263 if (mAppConfig) { 0264 return mAppConfig->findItem(baseConfigItem->name()); 0265 } 0266 0267 return nullptr; 0268 } 0269 0270 void PrefsPrivate::setBool(KCoreConfigSkeleton::ItemBool *baseConfigItem, bool value) 0271 { 0272 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0273 if (appItem) { 0274 auto item = dynamic_cast<KCoreConfigSkeleton::ItemBool *>(appItem); 0275 if (item) { 0276 item->setValue(value); 0277 } else { 0278 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Bool"; 0279 } 0280 } else { 0281 baseConfigItem->setValue(value); 0282 } 0283 } 0284 0285 bool PrefsPrivate::getBool(const KCoreConfigSkeleton::ItemBool *baseConfigItem) const 0286 { 0287 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0288 if (appItem) { 0289 auto item = dynamic_cast<KCoreConfigSkeleton::ItemBool *>(appItem); 0290 if (item) { 0291 return item->value(); 0292 } 0293 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Bool"; 0294 } 0295 return baseConfigItem->value(); 0296 } 0297 0298 void PrefsPrivate::setInt(KCoreConfigSkeleton::ItemInt *baseConfigItem, int value) 0299 { 0300 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0301 if (appItem) { 0302 auto item = dynamic_cast<KCoreConfigSkeleton::ItemInt *>(appItem); 0303 if (item) { 0304 item->setValue(value); 0305 } else { 0306 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Int"; 0307 } 0308 } else { 0309 baseConfigItem->setValue(value); 0310 } 0311 } 0312 0313 int PrefsPrivate::getInt(const KCoreConfigSkeleton::ItemInt *baseConfigItem) const 0314 { 0315 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0316 if (appItem) { 0317 auto item = dynamic_cast<KCoreConfigSkeleton::ItemInt *>(appItem); 0318 if (item) { 0319 return item->value(); 0320 } 0321 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Int"; 0322 } 0323 return baseConfigItem->value(); 0324 } 0325 0326 void PrefsPrivate::setString(KCoreConfigSkeleton::ItemString *baseConfigItem, const QString &value) 0327 { 0328 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0329 if (appItem) { 0330 auto item = dynamic_cast<KCoreConfigSkeleton::ItemString *>(appItem); 0331 0332 if (item) { 0333 item->setValue(value); 0334 } else { 0335 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type String"; 0336 } 0337 } else { 0338 baseConfigItem->setValue(value); 0339 } 0340 } 0341 0342 QString PrefsPrivate::getString(const KCoreConfigSkeleton::ItemString *baseConfigItem) const 0343 { 0344 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0345 if (appItem) { 0346 auto item = dynamic_cast<KCoreConfigSkeleton::ItemString *>(appItem); 0347 0348 if (item) { 0349 return item->value(); 0350 } 0351 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type String"; 0352 } 0353 return baseConfigItem->value(); 0354 } 0355 0356 void PrefsPrivate::setDateTime(KCoreConfigSkeleton::ItemDateTime *baseConfigItem, const QDateTime &value) 0357 { 0358 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0359 if (appItem) { 0360 auto item = dynamic_cast<KCoreConfigSkeleton::ItemDateTime *>(appItem); 0361 0362 if (item) { 0363 item->setValue(value); 0364 } else { 0365 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type DateTime"; 0366 } 0367 } else { 0368 baseConfigItem->setValue(value); 0369 } 0370 } 0371 0372 QDateTime PrefsPrivate::getDateTime(const KCoreConfigSkeleton::ItemDateTime *baseConfigItem) const 0373 { 0374 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0375 if (appItem) { 0376 auto item = dynamic_cast<KCoreConfigSkeleton::ItemDateTime *>(appItem); 0377 0378 if (item) { 0379 return item->value(); 0380 } 0381 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type DateTime"; 0382 } 0383 return baseConfigItem->value(); 0384 } 0385 0386 void PrefsPrivate::setStringList(KCoreConfigSkeleton::ItemStringList *baseConfigItem, const QStringList &value) 0387 { 0388 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0389 if (appItem) { 0390 auto item = dynamic_cast<KCoreConfigSkeleton::ItemStringList *>(appItem); 0391 0392 if (item) { 0393 item->setValue(value); 0394 } else { 0395 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type StringList"; 0396 } 0397 } else { 0398 baseConfigItem->setValue(value); 0399 } 0400 } 0401 0402 QStringList PrefsPrivate::getStringList(const KCoreConfigSkeleton::ItemStringList *baseConfigItem) const 0403 { 0404 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0405 if (appItem) { 0406 auto item = dynamic_cast<KCoreConfigSkeleton::ItemStringList *>(appItem); 0407 0408 if (item) { 0409 return item->value(); 0410 } 0411 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type StringList"; 0412 } 0413 return baseConfigItem->value(); 0414 } 0415 0416 void PrefsPrivate::setColor(KConfigSkeleton::ItemColor *baseConfigItem, const QColor &value) 0417 { 0418 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0419 if (appItem) { 0420 auto item = dynamic_cast<KConfigSkeleton::ItemColor *>(appItem); 0421 if (item) { 0422 item->setValue(value); 0423 } else { 0424 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Color"; 0425 } 0426 } else { 0427 baseConfigItem->setValue(value); 0428 } 0429 } 0430 0431 QColor PrefsPrivate::getColor(const KConfigSkeleton::ItemColor *baseConfigItem) const 0432 { 0433 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0434 if (appItem) { 0435 auto item = dynamic_cast<KConfigSkeleton::ItemColor *>(appItem); 0436 if (item) { 0437 return item->value(); 0438 } 0439 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Color"; 0440 } 0441 return baseConfigItem->value(); 0442 } 0443 0444 void PrefsPrivate::setFont(KConfigSkeleton::ItemFont *baseConfigItem, const QFont &value) 0445 { 0446 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0447 if (appItem) { 0448 auto item = dynamic_cast<KConfigSkeleton::ItemFont *>(appItem); 0449 if (item) { 0450 item->setValue(value); 0451 } else { 0452 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Font"; 0453 } 0454 } else { 0455 baseConfigItem->setValue(value); 0456 } 0457 } 0458 0459 QFont PrefsPrivate::getFont(const KConfigSkeleton::ItemFont *baseConfigItem) const 0460 { 0461 KConfigSkeletonItem *appItem = appConfigItem(baseConfigItem); 0462 if (appItem) { 0463 auto item = dynamic_cast<KConfigSkeleton::ItemFont *>(appItem); 0464 if (item) { 0465 return item->value(); 0466 } 0467 qCCritical(CALENDARVIEW_LOG) << "Application config item" << appItem->name() << "is not of type Font"; 0468 } 0469 return baseConfigItem->value(); 0470 } 0471 0472 Prefs::Prefs() 0473 : d(new PrefsPrivate(this)) 0474 { 0475 // necessary to use CollectionColorAttribute in the EventViews::resourceColor and EventViews::setResourceColor 0476 Akonadi::AttributeFactory::registerAttribute<Akonadi::CollectionColorAttribute>(); 0477 } 0478 0479 Prefs::Prefs(KCoreConfigSkeleton *appConfig) 0480 : d(new PrefsPrivate(this, appConfig)) 0481 { 0482 // necessary to use CollectionColorAttribute in the EventViews::resourceColor and EventViews::setResourceColor 0483 Akonadi::AttributeFactory::registerAttribute<Akonadi::CollectionColorAttribute>(); 0484 } 0485 0486 Prefs::~Prefs() = default; 0487 0488 void Prefs::readConfig() 0489 { 0490 d->mBaseConfig.load(); 0491 if (d->mAppConfig) { 0492 d->mAppConfig->load(); 0493 } 0494 } 0495 0496 void Prefs::writeConfig() 0497 { 0498 d->mBaseConfig.save(); 0499 if (d->mAppConfig) { 0500 d->mAppConfig->save(); 0501 } 0502 } 0503 0504 void Prefs::setUseSystemColor(bool useSystemColor) 0505 { 0506 d->setBool(d->mBaseConfig.useSystemColorItem(), useSystemColor); 0507 } 0508 0509 bool Prefs::useSystemColor() const 0510 { 0511 return d->getBool(d->mBaseConfig.useSystemColorItem()); 0512 } 0513 0514 void Prefs::setMarcusBainsShowSeconds(bool showSeconds) 0515 { 0516 d->setBool(d->mBaseConfig.marcusBainsShowSecondsItem(), showSeconds); 0517 } 0518 0519 bool Prefs::marcusBainsShowSeconds() const 0520 { 0521 return d->getBool(d->mBaseConfig.marcusBainsShowSecondsItem()); 0522 } 0523 0524 void Prefs::setAgendaMarcusBainsLineLineColor(const QColor &color) 0525 { 0526 d->setColor(d->mBaseConfig.agendaMarcusBainsLineLineColorItem(), color); 0527 } 0528 0529 QColor Prefs::agendaMarcusBainsLineLineColor() const 0530 { 0531 return d->getColor(d->mBaseConfig.agendaMarcusBainsLineLineColorItem()); 0532 } 0533 0534 void Prefs::setMarcusBainsEnabled(bool enabled) 0535 { 0536 d->setBool(d->mBaseConfig.marcusBainsEnabledItem(), enabled); 0537 } 0538 0539 bool Prefs::marcusBainsEnabled() const 0540 { 0541 return d->getBool(d->mBaseConfig.marcusBainsEnabledItem()); 0542 } 0543 0544 void Prefs::setAgendaMarcusBainsLineFont(const QFont &font) 0545 { 0546 d->setFont(d->mBaseConfig.agendaMarcusBainsLineFontItem(), font); 0547 } 0548 0549 QFont Prefs::agendaMarcusBainsLineFont() const 0550 { 0551 return d->getFont(d->mBaseConfig.agendaMarcusBainsLineFontItem()); 0552 } 0553 0554 void Prefs::setHourSize(int size) 0555 { 0556 d->setInt(d->mBaseConfig.hourSizeItem(), size); 0557 } 0558 0559 int Prefs::hourSize() const 0560 { 0561 return d->getInt(d->mBaseConfig.hourSizeItem()); 0562 } 0563 0564 void Prefs::setDayBegins(const QDateTime &dateTime) 0565 { 0566 d->setDateTime(d->mBaseConfig.dayBeginsItem(), dateTime); 0567 } 0568 0569 QDateTime Prefs::dayBegins() const 0570 { 0571 return d->getDateTime(d->mBaseConfig.dayBeginsItem()); 0572 } 0573 0574 void Prefs::setFirstDayOfWeek(const int day) 0575 { 0576 d->setInt(d->mBaseConfig.weekStartDayItem(), day - 1); 0577 } 0578 0579 int Prefs::firstDayOfWeek() const 0580 { 0581 return d->getInt(d->mBaseConfig.weekStartDayItem()) + 1; 0582 } 0583 0584 void Prefs::setWorkingHoursStart(const QDateTime &dateTime) 0585 { 0586 d->setDateTime(d->mBaseConfig.workingHoursStartItem(), dateTime); 0587 } 0588 0589 QDateTime Prefs::workingHoursStart() const 0590 { 0591 return d->getDateTime(d->mBaseConfig.workingHoursStartItem()); 0592 } 0593 0594 void Prefs::setWorkingHoursEnd(const QDateTime &dateTime) 0595 { 0596 d->setDateTime(d->mBaseConfig.workingHoursEndItem(), dateTime); 0597 } 0598 0599 QDateTime Prefs::workingHoursEnd() const 0600 { 0601 return d->getDateTime(d->mBaseConfig.workingHoursEndItem()); 0602 } 0603 0604 void Prefs::setSelectionStartsEditor(bool startEditor) 0605 { 0606 d->setBool(d->mBaseConfig.selectionStartsEditorItem(), startEditor); 0607 } 0608 0609 bool Prefs::selectionStartsEditor() const 0610 { 0611 return d->getBool(d->mBaseConfig.selectionStartsEditorItem()); 0612 } 0613 0614 void Prefs::setAgendaGridWorkHoursBackgroundColor(const QColor &color) 0615 { 0616 d->setColor(d->mBaseConfig.agendaGridWorkHoursBackgroundColorItem(), color); 0617 } 0618 0619 QColor Prefs::agendaGridWorkHoursBackgroundColor() const 0620 { 0621 return d->getColor(d->mBaseConfig.agendaGridWorkHoursBackgroundColorItem()); 0622 } 0623 0624 void Prefs::setAgendaGridHighlightColor(const QColor &color) 0625 { 0626 d->setColor(d->mBaseConfig.agendaGridHighlightColorItem(), color); 0627 } 0628 0629 QColor Prefs::agendaGridHighlightColor() const 0630 { 0631 return d->getColor(d->mBaseConfig.agendaGridHighlightColorItem()); 0632 } 0633 0634 void Prefs::setAgendaGridBackgroundColor(const QColor &color) 0635 { 0636 d->setColor(d->mBaseConfig.agendaGridBackgroundColorItem(), color); 0637 } 0638 0639 QColor Prefs::agendaGridBackgroundColor() const 0640 { 0641 return d->getColor(d->mBaseConfig.agendaGridBackgroundColorItem()); 0642 } 0643 0644 void Prefs::setEnableAgendaItemIcons(bool enable) 0645 { 0646 d->setBool(d->mBaseConfig.enableAgendaItemIconsItem(), enable); 0647 } 0648 0649 bool Prefs::enableAgendaItemIcons() const 0650 { 0651 return d->getBool(d->mBaseConfig.enableAgendaItemIconsItem()); 0652 } 0653 0654 void Prefs::setTodosUseCategoryColors(bool useColors) 0655 { 0656 d->setBool(d->mBaseConfig.todosUseCategoryColorsItem(), useColors); 0657 } 0658 0659 bool Prefs::todosUseCategoryColors() const 0660 { 0661 return d->getBool(d->mBaseConfig.todosUseCategoryColorsItem()); 0662 } 0663 0664 void Prefs::setAgendaHolidaysBackgroundColor(const QColor &color) const 0665 { 0666 d->setColor(d->mBaseConfig.agendaHolidaysBackgroundColorItem(), color); 0667 } 0668 0669 QColor Prefs::agendaHolidaysBackgroundColor() const 0670 { 0671 return d->getColor(d->mBaseConfig.agendaHolidaysBackgroundColorItem()); 0672 } 0673 0674 void Prefs::setAgendaViewColors(int colors) 0675 { 0676 d->setInt(d->mBaseConfig.agendaViewColorsItem(), colors); 0677 } 0678 0679 int Prefs::agendaViewColors() const 0680 { 0681 return d->getInt(d->mBaseConfig.agendaViewColorsItem()); 0682 } 0683 0684 void Prefs::setAgendaViewFont(const QFont &font) 0685 { 0686 d->setFont(d->mBaseConfig.agendaViewFontItem(), font); 0687 } 0688 0689 QFont Prefs::agendaViewFont() const 0690 { 0691 return d->getFont(d->mBaseConfig.agendaViewFontItem()); 0692 } 0693 0694 void Prefs::setMonthViewFont(const QFont &font) 0695 { 0696 d->setFont(d->mBaseConfig.monthViewFontItem(), font); 0697 } 0698 0699 QFont Prefs::monthViewFont() const 0700 { 0701 return d->getFont(d->mBaseConfig.monthViewFontItem()); 0702 } 0703 0704 QColor Prefs::monthGridBackgroundColor() const 0705 { 0706 return d->getColor(d->mBaseConfig.monthGridBackgroundColorItem()); 0707 } 0708 0709 void Prefs::setMonthGridBackgroundColor(const QColor &color) 0710 { 0711 d->setColor(d->mBaseConfig.monthGridBackgroundColorItem(), color); 0712 } 0713 0714 QColor Prefs::monthGridWorkHoursBackgroundColor() const 0715 { 0716 return d->getColor(d->mBaseConfig.monthGridWorkHoursBackgroundColorItem()); 0717 } 0718 0719 void Prefs::monthGridWorkHoursBackgroundColor(const QColor &color) 0720 { 0721 d->setColor(d->mBaseConfig.monthGridWorkHoursBackgroundColorItem(), color); 0722 } 0723 0724 int Prefs::monthViewColors() const 0725 { 0726 return d->getInt(d->mBaseConfig.monthViewColorsItem()); 0727 } 0728 0729 void Prefs::setMonthViewColors(int colors) const 0730 { 0731 d->setInt(d->mBaseConfig.monthViewColorsItem(), colors); 0732 } 0733 0734 void Prefs::setEnableMonthItemIcons(bool enable) 0735 { 0736 d->setBool(d->mBaseConfig.enableMonthItemIconsItem(), enable); 0737 } 0738 0739 bool Prefs::enableMonthItemIcons() const 0740 { 0741 return d->getBool(d->mBaseConfig.enableMonthItemIconsItem()); 0742 } 0743 0744 bool Prefs::showTimeInMonthView() const 0745 { 0746 return d->getBool(d->mBaseConfig.showTimeInMonthViewItem()); 0747 } 0748 0749 void Prefs::setShowTimeInMonthView(bool show) 0750 { 0751 d->setBool(d->mBaseConfig.showTimeInMonthViewItem(), show); 0752 } 0753 0754 bool Prefs::showTodosMonthView() const 0755 { 0756 return d->getBool(d->mBaseConfig.showTodosMonthViewItem()); 0757 } 0758 0759 void Prefs::setShowTodosMonthView(bool enable) 0760 { 0761 d->setBool(d->mBaseConfig.showTodosMonthViewItem(), enable); 0762 } 0763 0764 bool Prefs::showJournalsMonthView() const 0765 { 0766 return d->getBool(d->mBaseConfig.showJournalsMonthViewItem()); 0767 } 0768 0769 void Prefs::setShowJournalsMonthView(bool enable) 0770 { 0771 d->setBool(d->mBaseConfig.showJournalsMonthViewItem(), enable); 0772 } 0773 0774 bool Prefs::fullViewMonth() const 0775 { 0776 return d->getBool(d->mBaseConfig.fullViewMonthItem()); 0777 } 0778 0779 void Prefs::setFullViewMonth(bool fullView) 0780 { 0781 d->setBool(d->mBaseConfig.fullViewMonthItem(), fullView); 0782 } 0783 0784 bool Prefs::sortCompletedTodosSeparately() const 0785 { 0786 return d->getBool(d->mBaseConfig.sortCompletedTodosSeparatelyItem()); 0787 } 0788 0789 void Prefs::setSortCompletedTodosSeparately(bool enable) 0790 { 0791 d->setBool(d->mBaseConfig.sortCompletedTodosSeparatelyItem(), enable); 0792 } 0793 0794 void Prefs::setEnableToolTips(bool enable) 0795 { 0796 d->setBool(d->mBaseConfig.enableToolTipsItem(), enable); 0797 } 0798 0799 bool Prefs::enableToolTips() const 0800 { 0801 return d->getBool(d->mBaseConfig.enableToolTipsItem()); 0802 } 0803 0804 void Prefs::setShowTodosAgendaView(bool show) 0805 { 0806 d->setBool(d->mBaseConfig.showTodosAgendaViewItem(), show); 0807 } 0808 0809 bool Prefs::showTodosAgendaView() const 0810 { 0811 return d->getBool(d->mBaseConfig.showTodosAgendaViewItem()); 0812 } 0813 0814 void Prefs::setAgendaTimeLabelsFont(const QFont &font) 0815 { 0816 d->setFont(d->mBaseConfig.agendaTimeLabelsFontItem(), font); 0817 } 0818 0819 QFont Prefs::agendaTimeLabelsFont() const 0820 { 0821 return d->getFont(d->mBaseConfig.agendaTimeLabelsFontItem()); 0822 } 0823 0824 QTimeZone Prefs::timeZone() const 0825 { 0826 return QTimeZone::systemTimeZone(); 0827 } 0828 0829 bool Prefs::colorAgendaBusyDays() const 0830 { 0831 return d->getBool(d->mBaseConfig.colorBusyDaysEnabledItem()); 0832 } 0833 0834 bool Prefs::colorMonthBusyDays() const 0835 { 0836 return d->getBool(d->mBaseConfig.colorMonthBusyDaysEnabledItem()); 0837 } 0838 0839 QColor Prefs::viewBgBusyColor() const 0840 { 0841 return d->getColor(d->mBaseConfig.viewBgBusyColorItem()); 0842 } 0843 0844 void Prefs::setViewBgBusyColor(const QColor &color) 0845 { 0846 d->mBaseConfig.mViewBgBusyColor = color; 0847 } 0848 0849 QColor Prefs::holidayColor() const 0850 { 0851 return d->getColor(d->mBaseConfig.holidayColorItem()); 0852 } 0853 0854 void Prefs::setHolidayColor(const QColor &color) 0855 { 0856 d->mBaseConfig.mHolidayColor = color; 0857 } 0858 0859 QColor Prefs::agendaViewBackgroundColor() const 0860 { 0861 return d->getColor(d->mBaseConfig.agendaBgColorItem()); 0862 } 0863 0864 void Prefs::setAgendaViewBackgroundColor(const QColor &color) 0865 { 0866 d->mBaseConfig.mAgendaBgColor = color; 0867 } 0868 0869 QColor Prefs::workingHoursColor() const 0870 { 0871 return d->getColor(d->mBaseConfig.workingHoursColorItem()); 0872 } 0873 0874 void Prefs::setWorkingHoursColor(const QColor &color) 0875 { 0876 d->mBaseConfig.mWorkingHoursColor = color; 0877 } 0878 0879 QColor Prefs::todoDueTodayColor() const 0880 { 0881 return d->getColor(d->mBaseConfig.todoDueTodayColorItem()); 0882 } 0883 0884 void Prefs::setTodoDueTodayColor(const QColor &color) 0885 { 0886 d->mBaseConfig.mTodoDueTodayColor = color; 0887 } 0888 0889 QColor Prefs::todoOverdueColor() const 0890 { 0891 return d->getColor(d->mBaseConfig.todoOverdueColorItem()); 0892 } 0893 0894 void Prefs::setTodoOverdueColor(const QColor &color) 0895 { 0896 d->mBaseConfig.mTodoOverdueColor = color; 0897 } 0898 0899 void Prefs::setColorAgendaBusyDays(bool enable) 0900 { 0901 d->mBaseConfig.mColorBusyDaysEnabled = enable; 0902 } 0903 0904 void Prefs::setColorMonthBusyDays(bool enable) 0905 { 0906 d->mBaseConfig.mColorMonthBusyDaysEnabled = enable; 0907 } 0908 0909 void Prefs::setResourceColor(const QString &cal, const QColor &color) 0910 { 0911 d->mBaseConfig.setResourceColor(cal, color); 0912 } 0913 0914 QColor Prefs::resourceColorKnown(const QString &cal) const 0915 { 0916 QColor color; 0917 if (!cal.isEmpty()) { 0918 color = d->mBaseConfig.mResourceColors.value(cal); 0919 } 0920 return color; 0921 } 0922 0923 QColor Prefs::resourceColor(const QString &cal) 0924 { 0925 if (cal.isEmpty()) { 0926 return d->mBaseConfig.mDefaultResourceColor; 0927 } 0928 0929 QColor color = resourceColorKnown(cal); 0930 0931 // assign default color if enabled 0932 if (!color.isValid() && d->getBool(d->mBaseConfig.assignDefaultResourceColorsItem())) { 0933 color.setRgb(0x37, 0x7A, 0xBC); // blueish 0934 const int seed = d->getInt(d->mBaseConfig.defaultResourceColorSeedItem()); 0935 const QStringList colors = d->getStringList(d->mBaseConfig.defaultResourceColorsItem()); 0936 if (seed > 0 && seed - 1 < colors.size()) { 0937 color = QColor::fromString(colors[seed - 1]); 0938 } else { 0939 color.setRgb(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)); 0940 } 0941 d->setInt(d->mBaseConfig.defaultResourceColorSeedItem(), (seed + 1)); 0942 d->mBaseConfig.setResourceColor(cal, color); 0943 } 0944 if (color.isValid()) { 0945 return color; 0946 } else { 0947 return d->mBaseConfig.mDefaultResourceColor; 0948 } 0949 } 0950 0951 QStringList Prefs::timeScaleTimezones() const 0952 { 0953 return d->mBaseConfig.timeScaleTimezones(); 0954 } 0955 0956 void Prefs::setTimeScaleTimezones(const QStringList &list) 0957 { 0958 d->mBaseConfig.setTimeScaleTimezones(list); 0959 } 0960 0961 KConfigSkeleton::ItemFont *Prefs::fontItem(const QString &name) const 0962 { 0963 KConfigSkeletonItem *item = d->mAppConfig ? d->mAppConfig->findItem(name) : nullptr; 0964 0965 if (!item) { 0966 item = d->mBaseConfig.findItem(name); 0967 } 0968 0969 return dynamic_cast<KConfigSkeleton::ItemFont *>(item); 0970 } 0971 0972 QStringList Prefs::selectedPlugins() const 0973 { 0974 return d->mBaseConfig.mSelectedPlugins; 0975 } 0976 0977 QStringList Prefs::decorationsAtAgendaViewTop() const 0978 { 0979 return d->mBaseConfig.decorationsAtAgendaViewTop(); 0980 } 0981 0982 QStringList Prefs::decorationsAtAgendaViewBottom() const 0983 { 0984 return d->mBaseConfig.decorationsAtAgendaViewBottom(); 0985 } 0986 0987 void Prefs::setSelectedPlugins(const QStringList &plugins) 0988 { 0989 d->mBaseConfig.setSelectedPlugins(plugins); 0990 } 0991 0992 void Prefs::setDecorationsAtAgendaViewTop(const QStringList &decorations) 0993 { 0994 d->mBaseConfig.setDecorationsAtAgendaViewTop(decorations); 0995 } 0996 0997 void Prefs::setDecorationsAtAgendaViewBottom(const QStringList &decorations) 0998 { 0999 d->mBaseConfig.setDecorationsAtAgendaViewBottom(decorations); 1000 } 1001 1002 QSet<EventViews::EventView::ItemIcon> Prefs::agendaViewIcons() const 1003 { 1004 return d->mBaseConfig.mAgendaViewIcons; 1005 } 1006 1007 void Prefs::setAgendaViewIcons(const QSet<EventViews::EventView::ItemIcon> &icons) 1008 { 1009 d->mBaseConfig.mAgendaViewIcons = icons; 1010 } 1011 1012 QSet<EventViews::EventView::ItemIcon> Prefs::monthViewIcons() const 1013 { 1014 return d->mBaseConfig.mMonthViewIcons; 1015 } 1016 1017 void Prefs::setMonthViewIcons(const QSet<EventViews::EventView::ItemIcon> &icons) 1018 { 1019 d->mBaseConfig.mMonthViewIcons = icons; 1020 } 1021 1022 void Prefs::setFlatListTodo(bool enable) 1023 { 1024 d->mBaseConfig.mFlatListTodo = enable; 1025 } 1026 1027 bool Prefs::flatListTodo() const 1028 { 1029 return d->mBaseConfig.mFlatListTodo; 1030 } 1031 1032 void Prefs::setFullViewTodo(bool enable) 1033 { 1034 d->mBaseConfig.mFullViewTodo = enable; 1035 } 1036 1037 bool Prefs::fullViewTodo() const 1038 { 1039 return d->mBaseConfig.mFullViewTodo; 1040 } 1041 1042 bool Prefs::enableTodoQuickSearch() const 1043 { 1044 return d->mBaseConfig.mEnableTodoQuickSearch; 1045 } 1046 1047 void Prefs::setEnableTodoQuickSearch(bool enable) 1048 { 1049 d->mBaseConfig.mEnableTodoQuickSearch = enable; 1050 } 1051 1052 bool Prefs::enableQuickTodo() const 1053 { 1054 return d->mBaseConfig.mEnableQuickTodo; 1055 } 1056 1057 void Prefs::setEnableQuickTodo(bool enable) 1058 { 1059 d->mBaseConfig.mEnableQuickTodo = enable; 1060 } 1061 1062 bool Prefs::highlightTodos() const 1063 { 1064 return d->mBaseConfig.mHighlightTodos; 1065 } 1066 1067 void Prefs::setHighlightTodos(bool highlight) 1068 { 1069 d->mBaseConfig.mHighlightTodos = highlight; 1070 } 1071 1072 KConfig *Prefs::config() const 1073 { 1074 return d->mAppConfig ? d->mAppConfig->config() : d->mBaseConfig.config(); 1075 }