diff --git a/agents/archivemailagent/archivemailwidget.cpp b/agents/archivemailagent/archivemailwidget.cpp index a13f056de..73ff45d5b 100644 --- a/agents/archivemailagent/archivemailwidget.cpp +++ b/agents/archivemailagent/archivemailwidget.cpp @@ -1,344 +1,344 @@ /* Copyright (C) 2015-2020 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "archivemailwidget.h" #include "addarchivemaildialog.h" #include "archivemailagentutil.h" #include "archivemailkernel.h" #include "kmail-version.h" #include #include #include #include #include #include #include #include #include #include namespace { inline QString archiveMailCollectionPattern() { return QStringLiteral("ArchiveMailCollection \\d+"); } static const char myConfigGroupName[] = "ArchiveMailDialog"; } ArchiveMailItem::ArchiveMailItem(QTreeWidget *parent) : QTreeWidgetItem(parent) { } ArchiveMailItem::~ArchiveMailItem() { delete mInfo; } void ArchiveMailItem::setInfo(ArchiveMailInfo *info) { mInfo = info; } ArchiveMailInfo *ArchiveMailItem::info() const { return mInfo; } ArchiveMailWidget::ArchiveMailWidget(const KSharedConfigPtr &config, QWidget *parent, const QVariantList &args) : Akonadi::AgentConfigurationBase(config, parent, args) , mChanged(false) { ArchiveMailKernel *archiveMailKernel = new ArchiveMailKernel(this); CommonKernel->registerKernelIf(archiveMailKernel); //register KernelIf early, it is used by the Filter classes CommonKernel->registerSettingsIf(archiveMailKernel); //SettingsIf is used in FolderTreeWidget QWidget *w = new QWidget(parent); mWidget.setupUi(w); parent->layout()->addWidget(w); QStringList headers; headers << i18n("Name") << i18n("Last archive") << i18n("Next archive in") << i18n("Storage directory"); mWidget.treeWidget->setHeaderLabels(headers); mWidget.treeWidget->setObjectName(QStringLiteral("treewidget")); mWidget.treeWidget->setSortingEnabled(true); mWidget.treeWidget->setRootIsDecorated(false); mWidget.treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); mWidget.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(mWidget.treeWidget, &QWidget::customContextMenuRequested, this, &ArchiveMailWidget::slotCustomContextMenuRequested); connect(mWidget.removeItem, &QAbstractButton::clicked, this, &ArchiveMailWidget::slotRemoveItem); connect(mWidget.modifyItem, &QAbstractButton::clicked, this, &ArchiveMailWidget::slotModifyItem); connect(mWidget.addItem, &QAbstractButton::clicked, this, &ArchiveMailWidget::slotAddItem); connect(mWidget.treeWidget, &QTreeWidget::itemChanged, this, &ArchiveMailWidget::slotItemChanged); connect(mWidget.treeWidget, &QTreeWidget::itemSelectionChanged, this, &ArchiveMailWidget::updateButtons); connect(mWidget.treeWidget, &QTreeWidget::itemDoubleClicked, this, &ArchiveMailWidget::slotModifyItem); updateButtons(); KAboutData aboutData( QStringLiteral("archivemailagent"), i18n("Archive Mail Agent"), QStringLiteral(KDEPIM_VERSION), i18n("Archive emails automatically."), KAboutLicense::GPL_V2, - i18n("Copyright (C) 2014-2019 Laurent Montel")); + i18n("Copyright (C) 2014-2020 Laurent Montel")); aboutData.addAuthor(i18n("Laurent Montel"), i18n("Maintainer"), QStringLiteral("montel@kde.org")); aboutData.setTranslator(i18nc("NAME OF TRANSLATORS", "Your names"), i18nc("EMAIL OF TRANSLATORS", "Your emails")); setKAboutData(aboutData); } ArchiveMailWidget::~ArchiveMailWidget() { } void ArchiveMailWidget::slotCustomContextMenuRequested(const QPoint &) { const QList listItems = mWidget.treeWidget->selectedItems(); QMenu menu(parentWidget()); menu.addAction(QIcon::fromTheme(QStringLiteral("list-add")), i18n("Add..."), this, &ArchiveMailWidget::slotAddItem); if (!listItems.isEmpty()) { if (listItems.count() == 1) { menu.addAction(i18n("Open Containing Folder..."), this, &ArchiveMailWidget::slotOpenFolder); } menu.addSeparator(); menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Delete"), this, &ArchiveMailWidget::slotRemoveItem); } menu.exec(QCursor::pos()); } void ArchiveMailWidget::updateButtons() { const QList listItems = mWidget.treeWidget->selectedItems(); if (listItems.isEmpty()) { mWidget.removeItem->setEnabled(false); mWidget.modifyItem->setEnabled(false); } else if (listItems.count() == 1) { mWidget.removeItem->setEnabled(true); mWidget.modifyItem->setEnabled(true); } else { mWidget.removeItem->setEnabled(true); mWidget.modifyItem->setEnabled(false); } } void ArchiveMailWidget::needReloadConfig() { //TODO add messagebox which informs that we save settings here. mWidget.treeWidget->clear(); load(); } void ArchiveMailWidget::load() { const auto group = config()->group(myConfigGroupName); mWidget.treeWidget->header()->restoreState(group.readEntry("HeaderState", QByteArray())); const QStringList collectionList = config()->groupList().filter(QRegularExpression(archiveMailCollectionPattern())); const int numberOfCollection = collectionList.count(); for (int i = 0; i < numberOfCollection; ++i) { KConfigGroup group = config()->group(collectionList.at(i)); ArchiveMailInfo *info = new ArchiveMailInfo(group); if (info->isValid()) { createOrUpdateItem(info); } else { delete info; } } } void ArchiveMailWidget::createOrUpdateItem(ArchiveMailInfo *info, ArchiveMailItem *item) { if (!item) { item = new ArchiveMailItem(mWidget.treeWidget); } item->setText(ArchiveMailWidget::Name, i18n("Folder: %1", MailCommon::Util::fullCollectionPath(Akonadi::Collection(info->saveCollectionId())))); item->setCheckState(ArchiveMailWidget::Name, info->isEnabled() ? Qt::Checked : Qt::Unchecked); item->setText(ArchiveMailWidget::StorageDirectory, info->url().toLocalFile()); if (info->lastDateSaved().isValid()) { item->setText(ArchiveMailWidget::LastArchiveDate, QLocale().toString(info->lastDateSaved(), QLocale::ShortFormat)); updateDiffDate(item, info); } else { item->setBackground(ArchiveMailWidget::NextArchive, Qt::green); } item->setInfo(info); } void ArchiveMailWidget::updateDiffDate(ArchiveMailItem *item, ArchiveMailInfo *info) { const QDate diffDate = ArchiveMailAgentUtil::diffDate(info); const qint64 diff = QDate::currentDate().daysTo(diffDate); item->setText(ArchiveMailWidget::NextArchive, i18np("Tomorrow", "%1 days", diff)); if (diff < 0) { if (info->isEnabled()) { item->setBackground(ArchiveMailWidget::NextArchive, Qt::red); } else { item->setBackground(ArchiveMailWidget::NextArchive, Qt::lightGray); } } else { item->setToolTip(ArchiveMailWidget::NextArchive, i18n("Archive will be done %1", QLocale().toString(diffDate, QLocale::ShortFormat))); } } bool ArchiveMailWidget::save() const { if (!mChanged) { return false; } // first, delete all filter groups: const QStringList filterGroups = config()->groupList().filter(QRegularExpression(archiveMailCollectionPattern())); for (const QString &group : filterGroups) { config()->deleteGroup(group); } const int numberOfItem(mWidget.treeWidget->topLevelItemCount()); for (int i = 0; i < numberOfItem; ++i) { ArchiveMailItem *mailItem = static_cast(mWidget.treeWidget->topLevelItem(i)); if (mailItem->info()) { KConfigGroup group = config()->group(ArchiveMailAgentUtil::archivePattern.arg(mailItem->info()->saveCollectionId())); mailItem->info()->writeConfig(group); } } auto group = config()->group(myConfigGroupName); group.writeEntry("HeaderState", mWidget.treeWidget->header()->saveState()); return true; } void ArchiveMailWidget::slotRemoveItem() { const QList listItems = mWidget.treeWidget->selectedItems(); if (KMessageBox::warningYesNo(parentWidget(), i18n("Do you want to delete the selected items?"), i18n("Remove items")) == KMessageBox::No) { return; } for (QTreeWidgetItem *item : listItems) { delete item; } mChanged = true; updateButtons(); } void ArchiveMailWidget::slotModifyItem() { const QList listItems = mWidget.treeWidget->selectedItems(); if (listItems.count() == 1) { QTreeWidgetItem *item = listItems.at(0); if (!item) { return; } ArchiveMailItem *archiveItem = static_cast(item); QPointer dialog = new AddArchiveMailDialog(archiveItem->info(), parentWidget()); if (dialog->exec()) { ArchiveMailInfo *info = dialog->info(); createOrUpdateItem(info, archiveItem); mChanged = true; } delete dialog; } } void ArchiveMailWidget::slotAddItem() { QPointer dialog = new AddArchiveMailDialog(nullptr, parentWidget()); if (dialog->exec()) { ArchiveMailInfo *info = dialog->info(); if (verifyExistingArchive(info)) { KMessageBox::error(parentWidget(), i18n("Cannot add a second archive for this folder. Modify the existing one instead."), i18n("Add Archive Mail")); delete info; } else { createOrUpdateItem(info); updateButtons(); mChanged = true; } } delete dialog; } bool ArchiveMailWidget::verifyExistingArchive(ArchiveMailInfo *info) const { const int numberOfItem(mWidget.treeWidget->topLevelItemCount()); for (int i = 0; i < numberOfItem; ++i) { ArchiveMailItem *mailItem = static_cast(mWidget.treeWidget->topLevelItem(i)); ArchiveMailInfo *archiveItemInfo = mailItem->info(); if (archiveItemInfo) { if (info->saveCollectionId() == archiveItemInfo->saveCollectionId()) { return true; } } } return false; } void ArchiveMailWidget::slotOpenFolder() { const QList listItems = mWidget.treeWidget->selectedItems(); if (listItems.count() == 1) { QTreeWidgetItem *item = listItems.first(); if (!item) { return; } ArchiveMailItem *archiveItem = static_cast(item); ArchiveMailInfo *archiveItemInfo = archiveItem->info(); if (archiveItemInfo) { const QUrl url = archiveItemInfo->url(); KRun *runner = new KRun(url, parentWidget()); // will delete itself runner->setRunExecutables(false); } } } void ArchiveMailWidget::slotItemChanged(QTreeWidgetItem *item, int col) { if (item) { ArchiveMailItem *archiveItem = static_cast(item); if (archiveItem->info()) { if (col == ArchiveMailWidget::Name) { archiveItem->info()->setEnabled(archiveItem->checkState(ArchiveMailWidget::Name) == Qt::Checked); mChanged = true; } else if (col == ArchiveMailWidget::NextArchive) { updateDiffDate(archiveItem, archiveItem->info()); } } } } QSize ArchiveMailWidget::restoreDialogSize() const { auto group = config()->group(myConfigGroupName); const QSize size = group.readEntry("Size", QSize(500, 300)); return size; } void ArchiveMailWidget::saveDialogSize(const QSize &size) { auto group = config()->group(myConfigGroupName); group.writeEntry("Size", size); } diff --git a/agents/followupreminderagent/followupreminderinfoconfigwidget.cpp b/agents/followupreminderagent/followupreminderinfoconfigwidget.cpp index dce73042f..64f12b480 100644 --- a/agents/followupreminderagent/followupreminderinfoconfigwidget.cpp +++ b/agents/followupreminderagent/followupreminderinfoconfigwidget.cpp @@ -1,78 +1,78 @@ /* Copyright (C) 2018-2020 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "followupreminderinfoconfigwidget.h" #include "followupreminderinfowidget.h" #include "kmail-version.h" #include #include #include #include namespace { static const char myConfigGroupName[] = "FollowUpReminderInfoDialog"; } FollowUpReminderInfoConfigWidget::FollowUpReminderInfoConfigWidget(const KSharedConfigPtr &config, QWidget *parent, const QVariantList &args) : Akonadi::AgentConfigurationBase(config, parent, args) { mWidget = new FollowUpReminderInfoWidget(parent); parent->layout()->addWidget(mWidget); KAboutData aboutData = KAboutData( QStringLiteral("followupreminderagent"), i18n("Follow Up Reminder Agent"), QStringLiteral(KDEPIM_VERSION), i18n("Follow Up Reminder"), KAboutLicense::GPL_V2, - i18n("Copyright (C) 2014-2019 Laurent Montel")); + i18n("Copyright (C) 2014-2020 Laurent Montel")); aboutData.addAuthor(i18n("Laurent Montel"), i18n("Maintainer"), QStringLiteral("montel@kde.org")); aboutData.setTranslator(i18nc("NAME OF TRANSLATORS", "Your names"), i18nc("EMAIL OF TRANSLATORS", "Your emails")); setKAboutData(aboutData); } FollowUpReminderInfoConfigWidget::~FollowUpReminderInfoConfigWidget() { } void FollowUpReminderInfoConfigWidget::load() { mWidget->load(); } bool FollowUpReminderInfoConfigWidget::save() const { return mWidget->save(); } QSize FollowUpReminderInfoConfigWidget::restoreDialogSize() const { auto group = config()->group(myConfigGroupName); const QSize size = group.readEntry("Size", QSize(800, 600)); return size; } void FollowUpReminderInfoConfigWidget::saveDialogSize(const QSize &size) { auto group = config()->group(myConfigGroupName); group.writeEntry("Size", size); } diff --git a/agents/sendlateragent/sendlaterconfiguredialog.cpp b/agents/sendlateragent/sendlaterconfiguredialog.cpp index f7146ccf6..f92d41067 100644 --- a/agents/sendlateragent/sendlaterconfiguredialog.cpp +++ b/agents/sendlateragent/sendlaterconfiguredialog.cpp @@ -1,113 +1,113 @@ /* Copyright (C) 2013-2020 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "sendlaterconfiguredialog.h" #include "sendlaterconfigurewidget.h" #include "kmail-version.h" #include #include #include #include #include #include #include #include #include SendLaterConfigureDialog::SendLaterConfigureDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(i18nc("@title:window", "Configure")); setWindowIcon(QIcon::fromTheme(QStringLiteral("kmail"))); QVBoxLayout *mainLayout = new QVBoxLayout(this); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, this); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, &QDialogButtonBox::rejected, this, &SendLaterConfigureDialog::reject); mWidget = new SendLaterWidget(this); mWidget->setObjectName(QStringLiteral("sendlaterwidget")); connect(mWidget, &SendLaterWidget::sendNow, this, &SendLaterConfigureDialog::sendNow); mainLayout->addWidget(mWidget); mainLayout->addWidget(buttonBox); connect(okButton, &QPushButton::clicked, this, &SendLaterConfigureDialog::slotSave); readConfig(); KAboutData aboutData = KAboutData( QStringLiteral("sendlateragent"), i18n("Send Later Agent"), QStringLiteral(KDEPIM_VERSION), i18n("Send emails later agent."), KAboutLicense::GPL_V2, - i18n("Copyright (C) 2013-2019 Laurent Montel")); + i18n("Copyright (C) 2013-2020 Laurent Montel")); aboutData.addAuthor(i18n("Laurent Montel"), i18n("Maintainer"), QStringLiteral("montel@kde.org")); QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("kmail"))); aboutData.setTranslator(i18nc("NAME OF TRANSLATORS", "Your names"), i18nc("EMAIL OF TRANSLATORS", "Your emails")); KHelpMenu *helpMenu = new KHelpMenu(this, aboutData, true); //Initialize menu QMenu *menu = helpMenu->menu(); helpMenu->action(KHelpMenu::menuAboutApp)->setIcon(QIcon::fromTheme(QStringLiteral("kmail"))); buttonBox->button(QDialogButtonBox::Help)->setMenu(menu); } SendLaterConfigureDialog::~SendLaterConfigureDialog() { writeConfig(); } QVector SendLaterConfigureDialog::messagesToRemove() const { return mWidget->messagesToRemove(); } void SendLaterConfigureDialog::slotSave() { mWidget->save(); accept(); } void SendLaterConfigureDialog::slotNeedToReloadConfig() { mWidget->needToReload(); } void SendLaterConfigureDialog::readConfig() { KConfigGroup group(KSharedConfig::openConfig(), "SendLaterConfigureDialog"); const QSize sizeDialog = group.readEntry("Size", QSize(800, 600)); if (sizeDialog.isValid()) { resize(sizeDialog); } mWidget->restoreTreeWidgetHeader(group.readEntry("HeaderState", QByteArray())); } void SendLaterConfigureDialog::writeConfig() { KConfigGroup group(KSharedConfig::openConfig(), "SendLaterConfigureDialog"); group.writeEntry("Size", size()); mWidget->saveTreeWidgetHeader(group); } diff --git a/src/aboutdata.cpp b/src/aboutdata.cpp index 8576cc733..2612f7422 100644 --- a/src/aboutdata.cpp +++ b/src/aboutdata.cpp @@ -1,387 +1,387 @@ /* aboutdata.cpp This file is part of KMail, the KDE mail client. Copyright (c) 2003 Marc Mutz KMail is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. KMail is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA In addition, as a special exception, the copyright holders give permission to link the code of this program with any edition of the Qt library by Trolltech AS, Norway (or with modified versions of Qt that use the same license as Qt), and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than Qt. If you modify this file, you may extend this exception to your version of the file, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include "aboutdata.h" #include "kmail-version.h" #include namespace KMail { struct about_data { const char *name; const char *desc; const char *email; const char *web; }; // This file should not be changed by anybody other than the maintainer // If you change the maintainer here, change it in the MAINTAINERS file in the // top level folder as well. static const about_data authors[] = { { "Laurent Montel", I18N_NOOP("Maintainer"), "montel@kde.org", nullptr }, { "Thomas McGuire", I18N_NOOP("Former maintainer"), "mcguire@kde.org", nullptr }, { "Stefan Taferner", I18N_NOOP("Original author"), "taferner@kde.org", nullptr }, { "Michael H\303\244ckel", I18N_NOOP("Former maintainer"), "haeckel@kde.org", nullptr }, { "Ingo Kl\303\266cker", I18N_NOOP("Former maintainer"), "kloecker@kde.org", nullptr }, { "Don Sanders", I18N_NOOP("Former co-maintainer"), "sanders@kde.org", nullptr }, { "Till Adam", I18N_NOOP("Core developer"), "adam@kde.org", nullptr }, { "Volker Krause", I18N_NOOP("Core developer"), "vkrause@kde.org", nullptr }, { "Carsten Burghardt", I18N_NOOP("Former core developer"), "burghardt@kde.org", nullptr }, { "Marc Mutz", I18N_NOOP("Former core developer"), "mutz@kde.org", nullptr }, { "Zack Rusin", I18N_NOOP("Former core developer"), "zack@kde.org", nullptr }, { "Daniel Naber", I18N_NOOP("Documentation"), "daniel.naber@t-online.de", nullptr }, { "Toyohiro Asukai", nullptr, "toyohiro@ksmplus.com", nullptr }, { "Waldo Bastian", nullptr, "bastian@kde.org", nullptr }, { "Ryan Breen", I18N_NOOP("System tray notification"), "ryan@ryanbreen.com", nullptr }, { "Steven Brown", nullptr, "swbrown@ucsd.edu", nullptr }, { "Matthias Kalle Dalheimer", nullptr, "kalle@kde.org", nullptr }, { "Matt Douhan", nullptr, "matt@fruitsalad.org", nullptr }, { "Cristi Dumitrescu", nullptr, "cristid@chip.ro", nullptr }, { "David Faure", nullptr, "faure@kde.org", nullptr }, { "Philippe Fremy", nullptr, "pfremy@chez.com", nullptr }, { "Kurt Granroth", nullptr, "granroth@kde.org", nullptr }, { "Andreas Gungl", I18N_NOOP("PGP 6 support and further enhancements of the encryption support"), "a.gungl@gmx.de", nullptr }, { "Steffen Hansen", nullptr, "hansen@kde.org", nullptr }, { "Igor Janssen", nullptr, "rm@linux.ru.net", nullptr }, { "Matt Johnston", nullptr, "matt@caifex.org", nullptr }, { "Christer Kaivo-oja", nullptr, "whizkid@telia.com", nullptr }, { "Lars Knoll", I18N_NOOP("Original encryption support PGP 2 and PGP 5 support"), "knoll@kde.org", nullptr }, { "J. Nick Koston", I18N_NOOP("GnuPG support"), "bdraco@darkorb.net", nullptr }, { "Stephan Kulow", nullptr, "coolo@kde.org", nullptr }, { "Guillaume Laurent", nullptr, "glaurent@telegraph-road.org", nullptr }, { "Sam Magnuson", nullptr, "sam@trolltech.com", nullptr }, { "Matt Newell", nullptr, "newellm@proaxis.com", nullptr }, { "Denis Perchine", nullptr, "dyp@perchine.com", nullptr }, { "Samuel Penn", nullptr, "sam@bifrost.demon.co.uk", nullptr }, { "Carsten Pfeiffer", nullptr, "pfeiffer@kde.org", nullptr }, { "Sven Radej", nullptr, "radej@kde.org", nullptr }, { "Mark Roberts", nullptr, "mark@taurine.demon.co.uk", nullptr }, { "Wolfgang Rohdewald", nullptr, "wolfgang@rohdewald.de", nullptr }, { "Espen Sand", nullptr, "espen@kde.org", nullptr }, { "Aaron J. Seigo", nullptr, "aseigo@olympusproject.org", nullptr }, { "George Staikos", nullptr, "staikos@kde.org", nullptr }, { "Szymon Stefanek", I18N_NOOP("New message list and new folder tree"), "pragma@kvirc.net", nullptr }, { "Jason Stephenson", nullptr, "panda@mis.net", nullptr }, { "Jacek Stolarczyk", nullptr, "jacek@mer.chemia.polsl.gliwice.pl", nullptr }, { "Roberto S. Teixeira", nullptr, "maragato@kde.org", nullptr }, { "Bo Thorsen", nullptr, "bo@sonofthor.dk", nullptr }, { "Ronen Tzur", nullptr, "rtzur@shani.net", nullptr }, { "Mario Weilguni", nullptr, "mweilguni@sime.com", nullptr }, { "Wynn Wilkes", nullptr, "wynnw@calderasystems.com", nullptr }, { "Robert D. Williams", nullptr, "rwilliams@kde.org", nullptr }, { "Markus W\303\274bben", nullptr, "markus.wuebben@kde.org", nullptr }, { "Karl-Heinz Zimmer", nullptr, "khz@kde.org", nullptr } }; static const about_data credits[] = { { "Sam Abed", nullptr, nullptr, nullptr }, // KConfigXT porting, smileys->emoticons replacement { "Joern Ahrens", nullptr, nullptr, nullptr }, // implement wish 77182 (Add some separators to "Mark Message as" popup menu) { "Tom Albers", nullptr, nullptr, nullptr }, // small fixes, bugzilla maintenance { "Jaime Torres Amate", nullptr, "jtamate@gmail.com", nullptr }, { "Albert Cervera Areny", nullptr, nullptr, nullptr }, // implemented wish 88309 (optional compression of attachments) { "Jonathan Armond", nullptr, "jon.armond@gmail.com", nullptr }, { "Patrick Audley", nullptr, nullptr, nullptr }, // add optional graphical spam status to fancy headers { "Benjamin Azan", nullptr, nullptr, nullptr }, // implemented todo status handling { "Davide Bettio", nullptr, "davide.bettio@kdemail.net", nullptr }, { "Pradeepto Bhattacharya", nullptr, "pradeepto@kde.org", nullptr }, { "Bruno Bigras", nullptr, "bigras.bruno@gmail.com", nullptr }, { "Bertjan Broeksema", nullptr, "broeksema@kde.org", nullptr }, { "Albert Astals Cid", nullptr, nullptr, nullptr }, // fix for bug:95441 (folder tree context menu doesn't show shortcuts assigned to the actions) { "Cornelius Schumacher", nullptr, "schumacher@kde.org", nullptr }, // implemented the new recipients editor and picker { "Frederick Emmott", I18N_NOOP("Anti-virus support"), "fred87@users.sf.net", nullptr }, { "Christophe Giboudeaux", nullptr, "cgiboudeaux@gmail.com", nullptr }, { "Sandro Giessl", nullptr, nullptr, nullptr }, // frame width fixes for widget styles { "Olivier Goffart", nullptr, "ogoffart@kde.org", nullptr }, { "Severin Greimel", nullptr, nullptr, nullptr }, // several patches { "Shaheed Haque", nullptr, nullptr, nullptr }, // fix for bug:69744 (Resource folders: "Journals" should be "Journal") { "Ingo Heeskens", nullptr, nullptr, nullptr }, // implemented wish 34857 (per folder option for loading external references) { "Kurt Hindenburg", nullptr, nullptr, nullptr }, // implemented wish 89003 (delete whole thread) { "Heiko Hund", I18N_NOOP("POP filters"), "heiko@ist.eigentlich.net", nullptr }, { "Torsten Kasch", nullptr, nullptr, nullptr }, // crash fix for Solaris (cf. bug:68801) { "Jason 'vanRijn' Kasper", nullptr, nullptr, nullptr }, // implemented wish 79938 (configurable font for new/unread/important messages) { "Martijn Klingens", nullptr, nullptr, nullptr }, // fix keyboard navigation in the Status combo of the quick search { "Christoph Kl\303\274nter", nullptr, nullptr, nullptr }, // fix for bug:88216 (drag&drop from KAddressBook to the To: field) { "Martin Koller", nullptr, nullptr, nullptr }, // optional columns in the message list { "Tobias K\303\266nig", nullptr, nullptr, nullptr }, // edit recent addresses, store email<->OpenPGP key association in address book { "Nikolai Kosjar", nullptr, "klebezettel@gmx.net", nullptr }, { "Francois Kritzinger", nullptr, nullptr, nullptr }, // fix bug in configuration dialog { "Danny Kukawka", nullptr, nullptr, nullptr }, // DCOP enhancements for better message importing { "Roger Larsson", nullptr, nullptr, nullptr }, // add name of checked account to status bar message { "Michael Leupold", nullptr, "lemma@confuego.org", nullptr }, { "Thiago Macieira", nullptr, "thiago@kde.org", nullptr }, { "Andras Mantia", nullptr, "amantia@kde.org", nullptr }, { "Jonathan Marten", nullptr, "jjm@keelhaul.me.uk", nullptr }, { "Sergio Luis Martins", nullptr, "iamsergio@gmail.com", nullptr }, { "Jeffrey McGee", nullptr, nullptr, nullptr }, // fix for bug:64251 { "Thomas Moenicke", nullptr, "tm@php-qt.org", nullptr }, { "Dirk M\303\274ller", nullptr, nullptr, nullptr }, // QUrl() fixes and qt_cast optimizations { "Torgny Nyblom", nullptr, "nyblom@kde.org", nullptr }, { "OpenUsability", I18N_NOOP("Usability tests and improvements"), nullptr, "https://www.openusability.org" }, { "Mario Teijeiro Otero", nullptr, nullptr, nullptr }, // various vendor annotations fixes { "Kevin Ottens", nullptr, "ervin@kde.org", nullptr }, { "Simon Perreault", nullptr, nullptr, nullptr }, // make the composer remember its "Use Fixed Font" setting (bug 49481) { "Jakob Petsovits", nullptr, "jpetso@gmx.at", nullptr }, { "Romain Pokrzywka", nullptr, "romain@kdab.net", nullptr }, { "Bernhard Reiter", I18N_NOOP("\xC3\x84gypten and Kroupware project management"), "bernhard@intevation.de", nullptr }, { "Darío Andrés Rodríguez", nullptr, "andresbajotierra@gmail.com", nullptr }, { "Edwin Schepers", I18N_NOOP("Improved HTML support"), "yez@familieschepers.nl", nullptr }, // composition of HTML messages { "Jakob Schr\303\266ter", nullptr, nullptr, nullptr }, // implemented wish 28319 (X-Face support) { "Jan Simonson", I18N_NOOP("Beta testing of PGP 6 support"), "jan@simonson.pp.se", nullptr }, { "Paul Sprakes", nullptr, nullptr, nullptr }, // fix for bug:63619 (filter button in toolbar doesn't work), context menu clean up { "Jarosław Staniek", nullptr, "staniek@kde.org", nullptr }, // MS Windows porting { "Will Stephenson", nullptr, nullptr, nullptr }, // added IM status indicator { "Hasso Tepper", nullptr, nullptr, nullptr }, // improve layout of recipients editor { "Frank Thieme", nullptr, "frank@fthieme.net", nullptr }, { "Patrick S. Vogt", I18N_NOOP("Timestamp for 'Transmission completed' status messages"), "patrick.vogt@unibas.ch", nullptr }, { "Jan-Oliver Wagner", I18N_NOOP("\xC3\x84gypten and Kroupware project management"), "jan@intevation.de", nullptr }, { "Wolfgang Westphal", I18N_NOOP("Multiple encryption keys per address"), "wolfgang.westphal@gmx.de", nullptr }, { "Allen Winter", nullptr, "winter@kde.org", nullptr }, { "Urs Wolfer", nullptr, "uwolfer@kde.org", nullptr }, { "Thorsten Zachmann", I18N_NOOP("POP filters"), "t.zachmann@zagge.de", nullptr }, { "Thomas Zander", nullptr, nullptr, nullptr } }; AboutData::AboutData() : KAboutData(QStringLiteral("kmail2"), i18n("KMail"), QStringLiteral(KDEPIM_VERSION), i18n("KDE Email Client"), KAboutLicense::GPL, - i18n("Copyright © 1997–2019, KMail authors"), + i18n("Copyright © 1997–2020, KMail authors"), QString(), QStringLiteral("https://userbase.kde.org/KMail")) { using KMail::authors; using KMail::credits; const unsigned int numberAuthors(sizeof authors / sizeof *authors); for (unsigned int i = 0; i < numberAuthors; ++i) { addAuthor(i18n(authors[i].name), authors[i].desc ? i18n(authors[i].desc) : QString(), QLatin1String(authors[i].email), QLatin1String(authors[i].web)); } const unsigned int numberCredits(sizeof credits / sizeof *credits); for (unsigned int i = 0; i < numberCredits; ++i) { addCredit(i18n(credits[i].name), credits[i].desc ? i18n(credits[i].desc) : QString(), QLatin1String(credits[i].email), QLatin1String(credits[i].web)); } } AboutData::~AboutData() { } } // namespace KMail