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 }