19 #include "PimCommon/ConfigureImmutableWidgetUtils"
20 using namespace PimCommon::ConfigureImmutableWidgetUtils;
22 #include "messagelist/aggregationcombobox.h"
23 #include "messagelist/aggregationconfigbutton.h"
24 #include "messagelist/themecombobox.h"
25 #include "messagelist/themeconfigbutton.h"
26 #include "messagelistsettings.h"
27 #include "MailCommon/TagWidget"
28 #include "MailCommon/Tag"
32 #include "MailCommon/FolderTreeWidget"
36 #include "mailcommonsettings_base.h"
38 #include "MessageViewer/ConfigureWidget"
39 #include "messageviewer/messageviewersettings.h"
41 #include "messagelist/messagelistutil.h"
42 #include <MessageCore/MessageCoreSettings>
43 #include "MessageCore/MessageCoreUtil"
46 #include "MailCommon/MailUtil"
48 #include <AkonadiCore/Tag>
49 #include <AkonadiCore/TagFetchJob>
50 #include <AkonadiCore/TagFetchScope>
51 #include <AkonadiCore/TagDeleteJob>
52 #include <AkonadiCore/TagCreateJob>
53 #include <AkonadiCore/TagAttribute>
54 #include <AkonadiCore/TagModifyJob>
56 #include <KIconButton>
57 #include <KLocalizedString>
58 #include <KColorScheme>
60 #include <KFontChooser>
61 #include <QHBoxLayout>
62 #include <KMessageBox>
63 #include <KKeySequenceWidget>
66 #include "kmail_debug.h"
68 #include <kmime/kmime_dateformatter.h>
69 using KMime::DateFormatter;
72 #include <QButtonGroup>
75 #include <QFontDatabase>
77 #include <QVBoxLayout>
78 #include <QRadioButton>
80 using namespace MailCommon;
84 return QStringLiteral(
"configure-appearance");
94 addTab(readerTab, i18n(
"General"));
95 addConfig(MessageViewer::MessageViewerSettings::self(), readerTab);
101 addTab(fontsTab, i18n(
"Fonts"));
107 addTab(colorsTab, i18n(
"Colors"));
113 addTab(layoutTab, i18n(
"Layout"));
119 addTab(headersTab, i18n(
"Message List"));
125 addTab(messageTagTab, i18n(
"Message Tags"));
130 return QStringLiteral(
"configure-appearance-fonts");
133 static const struct {
139 {
"body-font", I18N_NOOP(
"Message Body"),
true,
false },
140 {
"MessageListFont", I18N_NOOP(
"Message List"),
true,
false },
141 {
"UnreadMessageFont", I18N_NOOP(
"Message List - Unread Messages"),
false,
false },
142 {
"ImportantMessageFont", I18N_NOOP(
"Message List - Important Messages"),
false,
false },
143 {
"TodoMessageFont", I18N_NOOP(
"Message List - Action Item Messages"),
false,
false },
144 {
"fixed-font", I18N_NOOP(
"Fixed Width Font"),
true,
true },
145 {
"composer-font", I18N_NOOP(
"Composer"),
true,
false },
146 {
"print-font", I18N_NOOP(
"Printing Output"),
true,
false },
152 , mActiveFontIndex(-1)
158 mCustomFontCheck =
new QCheckBox(i18n(
"&Use custom fonts"),
this);
160 vlay->
addWidget(
new KSeparator(Qt::Horizontal,
this));
167 mFontLocationCombo =
new QComboBox(
this);
175 mFontLocationCombo->
addItems(fontDescriptions);
178 label->
setBuddy(mFontLocationCombo);
184 mFontChooser =
new KFontChooser(
this, KFontChooser::DisplayFrame,
186 mFontChooser->setEnabled(
false);
188 connect(mFontChooser, &KFontChooser::fontSelected,
200 this, &AppearancePage::FontsTab::slotFontSelectorChanged);
203 void AppearancePage::FontsTab::slotFontSelectorChanged(
int index)
205 qCDebug(KMAIL_LOG) <<
"slotFontSelectorChanged() called";
206 if (index < 0 || index >= mFontLocationCombo->
count()) {
211 if (mActiveFontIndex == 0) {
212 mFont[0] = mFontChooser->font();
223 }
else if (mActiveFontIndex > 0) {
224 mFont[ mActiveFontIndex ] = mFontChooser->font();
226 mActiveFontIndex = index;
229 disconnect(mFontChooser, &KFontChooser::fontSelected,
235 connect(mFontChooser, &KFontChooser::fontSelected,
239 mFontChooser->enableColumn(KFontChooser::FamilyList | KFontChooser::SizeList,
243 void AppearancePage::FontsTab::doLoadOther()
248 mFont[0] = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
249 QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
254 mFont[i] = MessageList::MessageListSettings::self()->messageListFont();
255 }
else if (configName ==
QLatin1String(
"UnreadMessageFont")) {
256 mFont[i] = MessageList::MessageListSettings::self()->unreadMessageFont();
257 }
else if (configName ==
QLatin1String(
"ImportantMessageFont")) {
258 mFont[i] = MessageList::MessageListSettings::self()->importantMessageFont();
260 mFont[i] = MessageList::MessageListSettings::self()->todoMessageFont();
262 mFont[i] = fonts.readEntry(configName,
263 (
fontNames[i].onlyFixed) ? fixedFont : mFont[0]);
266 mCustomFontCheck->
setChecked(!MessageCore::MessageCoreSettings::self()->useDefaultFonts());
268 slotFontSelectorChanged(0);
280 if (mActiveFontIndex >= 0) {
281 mFont[ mActiveFontIndex ] = mFontChooser->font();
284 const bool customFonts = mCustomFontCheck->
isChecked();
285 MessageCore::MessageCoreSettings::self()->setUseDefaultFonts(!customFonts);
289 if (customFonts && configName ==
QLatin1String(
"MessageListFont")) {
290 MessageList::MessageListSettings::self()->setMessageListFont(mFont[i]);
291 }
else if (customFonts && configName ==
QLatin1String(
"UnreadMessageFont")) {
292 MessageList::MessageListSettings::self()->setUnreadMessageFont(mFont[i]);
293 }
else if (customFonts && configName ==
QLatin1String(
"ImportantMessageFont")) {
294 MessageList::MessageListSettings::self()->setImportantMessageFont(mFont[i]);
295 }
else if (customFonts && configName ==
QLatin1String(
"TodoMessageFont")) {
296 MessageList::MessageListSettings::self()->setTodoMessageFont(mFont[i]);
298 if (customFonts || fonts.hasKey(configName)) {
301 fonts.writeEntry(configName, mFont[i]);
308 void AppearancePage::FontsTab::doResetToDefaultsOther()
315 return QStringLiteral(
"configure-appearance-colors");
318 static const struct {
322 {
"QuotedText1", I18N_NOOP(
"Quoted Text - First Level") },
323 {
"QuotedText2", I18N_NOOP(
"Quoted Text - Second Level") },
324 {
"QuotedText3", I18N_NOOP(
"Quoted Text - Third Level") },
325 {
"LinkColor", I18N_NOOP(
"Link") },
326 {
"UnreadMessageColor", I18N_NOOP(
"Unread Message") },
327 {
"ImportantMessageColor", I18N_NOOP(
"Important Message") },
328 {
"TodoMessageColor", I18N_NOOP(
"Action Item Message") },
329 {
"ColorbarBackgroundPlain", I18N_NOOP(
"HTML Status Bar Background - No HTML Message") },
330 {
"ColorbarForegroundPlain", I18N_NOOP(
"HTML Status Bar Foreground - No HTML Message") },
331 {
"ColorbarBackgroundHTML", I18N_NOOP(
"HTML Status Bar Background - HTML Message") },
332 {
"ColorbarForegroundHTML", I18N_NOOP(
"HTML Status Bar Foreground - HTML Message") }
341 mCustomColorCheck =
new QCheckBox(i18n(
"&Use custom colors"),
this);
346 mUseInlineStyle =
new QCheckBox(i18n(
"&Do not change color from original HTML mail"),
this);
361 =
new QCheckBox(i18n(
"Recycle colors on deep "ing"),
this);
370 QLabel *l =
new QLabel(i18n(
"Close to quota threshold:"),
this);
372 mCloseToQuotaThreshold =
new QSpinBox(
this);
373 mCloseToQuotaThreshold->
setRange(0, 100);
377 mCloseToQuotaThreshold->
setSuffix(i18n(
"%"));
393 void AppearancePage::ColorsTab::doLoadOther()
395 mCustomColorCheck->
setChecked(!MessageCore::MessageCoreSettings::self()->useDefaultColors());
396 mUseInlineStyle->
setChecked(MessageCore::MessageCoreSettings::self()->useRealHtmlMailColor());
397 mRecycleColorCheck->
setChecked(MessageViewer::MessageViewerSettings::self()->recycleQuoteColors());
402 void AppearancePage::ColorsTab::loadColor(
bool loadFromConfig)
408 MessageCore::ColorUtil::self()->quoteLevel1DefaultTextColor(),
409 MessageCore::ColorUtil::self()->quoteLevel2DefaultTextColor(),
410 MessageCore::ColorUtil::self()->quoteLevel3DefaultTextColor(),
411 MessageCore::ColorUtil::self()->linkColor(),
412 MessageList::Util::unreadDefaultMessageColor(),
413 MessageList::Util::importantDefaultMessageColor(),
414 MessageList::Util::todoDefaultMessageColor(),
422 if (loadFromConfig) {
425 mColorList->
setColorSilently(i, MessageList::MessageListSettings::self()->unreadMessageColor());
426 }
else if (configName ==
QLatin1String(
"ImportantMessageColor")) {
427 mColorList->
setColorSilently(i, MessageList::MessageListSettings::self()->importantMessageColor());
428 }
else if (configName ==
QLatin1String(
"TodoMessageColor")) {
429 mColorList->
setColorSilently(i, MessageList::MessageListSettings::self()->todoMessageColor());
431 mColorList->
setColorSilently(i, reader.readEntry(configName, defaultColor[i]));
442 void AppearancePage::ColorsTab::doResetToDefaultsOther()
447 mCloseToQuotaThreshold->
setValue(80);
457 bool customColors = mCustomColorCheck->
isChecked();
458 MessageCore::MessageCoreSettings::self()->setUseDefaultColors(!customColors);
459 MessageCore::MessageCoreSettings::self()->setUseRealHtmlMailColor(mUseInlineStyle->
isChecked());
463 if (customColors && configName ==
QLatin1String(
"UnreadMessageColor")) {
464 MessageList::MessageListSettings::self()->setUnreadMessageColor(mColorList->
color(i));
465 }
else if (customColors && configName ==
QLatin1String(
"ImportantMessageColor")) {
466 MessageList::MessageListSettings::self()->setImportantMessageColor(mColorList->
color(i));
467 }
else if (customColors && configName ==
QLatin1String(
"TodoMessageColor")) {
468 MessageList::MessageListSettings::self()->setTodoMessageColor(mColorList->
color(i));
470 if (customColors || reader.hasKey(configName)) {
471 reader.writeEntry(configName, mColorList->
color(i));
475 MessageViewer::MessageViewerSettings::self()->setRecycleQuoteColors(mRecycleColorCheck->
isChecked());
481 return QStringLiteral(
"configure-appearance-layout");
490 populateButtonGroup(mFolderListGroupBox =
new QGroupBox(
this),
497 mFolderQuickSearchCB =
new QCheckBox(i18n(
"Show folder quick search field"),
this);
499 folderCBHLayout->
addWidget(mFolderQuickSearchCB);
503 mFavoriteFoldersViewGroupBox =
new QGroupBox(
this);
504 mFavoriteFoldersViewGroupBox->
setTitle(i18n(
"Show Favorite Folders View"));
510 mFavoriteFoldersViewGroup->
addButton(favoriteFoldersViewHiddenRadio, static_cast<int>(MailCommon::MailCommonSettings::EnumFavoriteCollectionViewMode::HiddenMode));
511 mFavoriteFoldersViewGroupBox->
layout()->
addWidget(favoriteFoldersViewHiddenRadio);
514 mFavoriteFoldersViewGroup->
addButton(favoriteFoldersViewIconsRadio, static_cast<int>(MailCommon::MailCommonSettings::EnumFavoriteCollectionViewMode::IconMode));
515 mFavoriteFoldersViewGroupBox->
layout()->
addWidget(favoriteFoldersViewIconsRadio);
518 mFavoriteFoldersViewGroup->
addButton(favoriteFoldersViewListRadio, static_cast<int>(MailCommon::MailCommonSettings::EnumFavoriteCollectionViewMode::ListMode));
519 mFavoriteFoldersViewGroupBox->
layout()->
addWidget(favoriteFoldersViewListRadio);
521 vlay->
addWidget(mFavoriteFoldersViewGroupBox);
524 mFolderToolTipsGroupBox =
new QGroupBox(
this);
525 mFolderToolTipsGroupBox->
setTitle(i18n(
"Folder Tooltips"));
531 mFolderToolTipsGroup->
addButton(folderToolTipsAlwaysRadio, static_cast< int >(FolderTreeWidget::DisplayAlways));
532 mFolderToolTipsGroupBox->
layout()->
addWidget(folderToolTipsAlwaysRadio);
535 mFolderToolTipsGroup->
addButton(folderToolTipsNeverRadio, static_cast< int >(FolderTreeWidget::DisplayNever));
536 mFolderToolTipsGroupBox->
layout()->
addWidget(folderToolTipsNeverRadio);
538 vlay->
addWidget(mFolderToolTipsGroupBox);
541 populateButtonGroup(mReaderWindowModeGroupBox =
new QGroupBox(
this),
544 vlay->
addWidget(mReaderWindowModeGroupBox);
551 void AppearancePage::LayoutTab::doLoadOther()
553 loadWidget(mFolderListGroupBox, mFolderListGroup,
KMailSettings::self()->folderListItem());
554 loadWidget(mReaderWindowModeGroupBox, mReaderWindowModeGroup,
KMailSettings::self()->readerWindowModeItem());
556 loadWidget(mFavoriteFoldersViewGroupBox, mFavoriteFoldersViewGroup,
KMKernel::self()->mailCommonSettings()->favoriteCollectionViewModeItem());
560 if (checkedFolderToolTipsPolicy >= 0) {
561 mFolderToolTipsGroup->
button(checkedFolderToolTipsPolicy)->
setChecked(
true);
570 saveButtonGroup(mFavoriteFoldersViewGroup,
KMKernel::self()->mailCommonSettings()->favoriteCollectionViewModeItem());
582 return QStringLiteral(
"configure-appearance-headers");
585 static const struct {
589 { I18N_NOOP(
"Sta&ndard format (%1)"), KMime::DateFormatter::CTime },
590 { I18N_NOOP(
"Locali&zed format (%1)"), KMime::DateFormatter::Localized },
591 { I18N_NOOP(
"Smart for&mat (%1)"), KMime::DateFormatter::Fancy },
592 { I18N_NOOP(
"C&ustom format:"), KMime::DateFormatter::Custom }
599 , mCustomDateFormatEdit(nullptr)
604 QGroupBox *group =
new QGroupBox(i18nc(
"General options for the message list.",
"General"),
this);
608 MessageList::MessageListSettings::self()->messageToolTipEnabledItem()->label(), group);
609 gvlay->
addWidget(mDisplayMessageToolTips);
615 using MessageList::Utils::AggregationComboBox;
616 mAggregationComboBox =
new AggregationComboBox(group);
618 QLabel *aggregationLabel =
new QLabel(i18n(
"Default aggregation:"), group);
619 aggregationLabel->
setBuddy(mAggregationComboBox);
621 using MessageList::Utils::AggregationConfigButton;
622 AggregationConfigButton *aggregationConfigButton =
new AggregationConfigButton(group, mAggregationComboBox);
625 aggregationLayout->
addWidget(aggregationLabel, 1);
626 aggregationLayout->
addWidget(mAggregationComboBox, 1);
627 aggregationLayout->
addWidget(aggregationConfigButton, 0);
630 connect(aggregationConfigButton, &MessageList::Utils::AggregationConfigButton::configureDialogCompleted,
631 this, &AppearancePageHeadersTab::slotSelectDefaultAggregation);
632 connect(mAggregationComboBox, qOverload<int>(&MessageList::Utils::AggregationComboBox::activated),
636 using MessageList::Utils::ThemeComboBox;
637 mThemeComboBox =
new ThemeComboBox(group);
639 QLabel *themeLabel =
new QLabel(i18n(
"Default theme:"), group);
640 themeLabel->
setBuddy(mThemeComboBox);
642 using MessageList::Utils::ThemeConfigButton;
643 ThemeConfigButton *themeConfigButton =
new ThemeConfigButton(group, mThemeComboBox);
647 themeLayout->
addWidget(mThemeComboBox, 1);
648 themeLayout->
addWidget(themeConfigButton, 0);
651 connect(themeConfigButton, &MessageList::Utils::ThemeConfigButton::configureDialogCompleted,
652 this, &AppearancePageHeadersTab::slotSelectDefaultTheme);
653 connect(mThemeComboBox, qOverload<int>(&MessageList::Utils::ThemeComboBox::activated),
660 mDateDisplayBox->
setTitle(i18n(
"Date Display"));
671 buttonLabel = i18n(label);
681 mCustomDateFormatEdit =
new KLineEdit(hbox);
682 hboxHBoxLayout->
addWidget(mCustomDateFormatEdit);
683 mCustomDateFormatEdit->setEnabled(
false);
692 i18n(
"<qt><a href=\"whatsthis1\">Custom format information...</a></qt>"), hbox);
695 this, &AppearancePageHeadersTab::slotLinkClicked);
699 = i18n(
"<qt><p><strong>These expressions may be used for the date:"
702 "<li>d - the day as a number without a leading zero (1-31)</li>"
703 "<li>dd - the day as a number with a leading zero (01-31)</li>"
704 "<li>ddd - the abbreviated day name (Mon - Sun)</li>"
705 "<li>dddd - the long day name (Monday - Sunday)</li>"
706 "<li>M - the month as a number without a leading zero (1-12)</li>"
707 "<li>MM - the month as a number with a leading zero (01-12)</li>"
708 "<li>MMM - the abbreviated month name (Jan - Dec)</li>"
709 "<li>MMMM - the long month name (January - December)</li>"
710 "<li>yy - the year as a two digit number (00-99)</li>"
711 "<li>yyyy - the year as a four digit number (0000-9999)</li>"
713 "<p><strong>These expressions may be used for the time:"
716 "<li>h - the hour without a leading zero (0-23 or 1-12 if AM/PM display)</li>"
717 "<li>hh - the hour with a leading zero (00-23 or 01-12 if AM/PM display)</li>"
718 "<li>m - the minutes without a leading zero (0-59)</li>"
719 "<li>mm - the minutes with a leading zero (00-59)</li>"
720 "<li>s - the seconds without a leading zero (0-59)</li>"
721 "<li>ss - the seconds with a leading zero (00-59)</li>"
722 "<li>z - the milliseconds without leading zeroes (0-999)</li>"
723 "<li>zzz - the milliseconds with leading zeroes (000-999)</li>"
724 "<li>AP - switch to AM/PM display. AP will be replaced by either \"AM\" or \"PM\".</li>"
725 "<li>ap - switch to AM/PM display. ap will be replaced by either \"am\" or \"pm\".</li>"
726 "<li>Z - time zone in numeric form (-0500)</li>"
728 "<p><strong>All other input characters will be ignored."
729 "</strong></p></qt>");
730 mCustomDateFormatEdit->setWhatsThis(mCustomDateWhatsThis);
746 void AppearancePageHeadersTab::slotLinkClicked(
const QString &link)
753 void AppearancePage::HeadersTab::slotSelectDefaultAggregation()
756 mAggregationComboBox->selectDefault();
759 void AppearancePage::HeadersTab::slotSelectDefaultTheme()
762 mThemeComboBox->selectDefault();
765 void AppearancePage::HeadersTab::doLoadOther()
768 loadWidget(mDisplayMessageToolTips, MessageList::MessageListSettings::self()->messageToolTipEnabledItem());
771 slotSelectDefaultAggregation();
774 slotSelectDefaultTheme();
777 setDateDisplay(MessageCore::MessageCoreSettings::self()->dateFormat(),
778 MessageCore::MessageCoreSettings::self()->customDateFormat());
781 void AppearancePage::HeadersTab::doLoadFromGlobalSettings()
783 loadWidget(mDisplayMessageToolTips, MessageList::MessageListSettings::self()->messageToolTipEnabledItem());
785 slotSelectDefaultAggregation();
788 slotSelectDefaultTheme();
790 setDateDisplay(MessageCore::MessageCoreSettings::self()->dateFormat(),
791 MessageCore::MessageCoreSettings::self()->customDateFormat());
794 void AppearancePage::HeadersTab::setDateDisplay(
int num,
const QString &format)
797 =
static_cast<DateFormatter::FormatType
>(num);
800 if (dateDisplay == DateFormatter::Custom) {
801 mCustomDateFormatEdit->setText(format);
816 saveCheckBox(mDisplayMessageToolTips, MessageList::MessageListSettings::self()->messageToolTipEnabledItem());
822 mAggregationComboBox->writeDefaultConfig();
825 mThemeComboBox->writeDefaultConfig();
827 const int dateDisplayID = mDateDisplay->
checkedId();
828 MessageCore::MessageCoreSettings::self()->setDateFormat(dateDisplayID);
829 MessageCore::MessageCoreSettings::self()->setCustomDateFormat(mCustomDateFormatEdit->text());
838 return QStringLiteral(
"configure-appearance-reader");
852 populateCheckBox(mCloseAfterReplyOrForwardCheck =
new QCheckBox(
this),
853 MessageViewer::MessageViewerSettings::self()->closeAfterReplyOrForwardItem());
855 i18n(
"Close the standalone message window after replying or forwarding the message"));
856 readerBoxLayout->
addWidget(mCloseAfterReplyOrForwardCheck);
860 mViewerSettings =
new MessageViewer::ConfigureWidget;
861 connect(mViewerSettings, &MessageViewer::ConfigureWidget::settingsChanged,
863 readerBoxLayout->
addWidget(mViewerSettings);
871 mSystemTrayCheck =
new QCheckBox(i18n(
"Enable system tray icon"),
this);
872 systrayBoxlayout->
addWidget(mSystemTrayCheck);
875 mStartInTrayCheck =
new QCheckBox(i18n(
"Start minimized to tray"));
876 systrayBoxlayout->
addWidget(mStartInTrayCheck);
880 if (state == Qt::Checked) {
886 if (state == Qt::Unchecked) {
893 mShowNumberInTaskBar =
new QCheckBox(i18n(
"Show unread email in Taskbar"),
this);
894 systrayBoxlayout->
addWidget(mShowNumberInTaskBar);
901 void AppearancePage::ReaderTab::doResetToDefaultsOther()
905 void AppearancePage::ReaderTab::doLoadOther()
910 loadWidget(mCloseAfterReplyOrForwardCheck, MessageViewer::MessageViewerSettings::self()->closeAfterReplyOrForwardItem());
911 mViewerSettings->readConfig();
920 saveCheckBox(mCloseAfterReplyOrForwardCheck, MessageViewer::MessageViewerSettings::self()->closeAfterReplyOrForwardItem());
921 mViewerSettings->writeConfig();
926 return QStringLiteral(
"configure-appearance-messagetag");
964 mTagsGroupBox =
new QGroupBox(i18n(
"A&vailable Tags"),
this);
972 mTagAddLineEdit =
new KLineEdit(mTagsGroupBox);
973 mTagAddLineEdit->setTrapReturnKey(
true);
974 addremovegrid->
addWidget(mTagAddLineEdit);
977 mTagAddButton->
setToolTip(i18n(
"Add new tag"));
982 mTagRemoveButton->
setToolTip(i18n(
"Remove selected tag"));
984 addremovegrid->
addWidget(mTagRemoveButton);
991 mTagUpButton->
setToolTip(i18n(
"Increase tag priority"));
997 mTagDownButton->
setToolTip(i18n(
"Decrease tag priority"));
1019 mTagSettingGroupBox =
new QGroupBox(i18n(
"Ta&g Settings"),
1021 tagsettinggrid->
addWidget(mTagSettingGroupBox);
1024 actionCollections =
kmkernel->getKMMainWidget()->actionCollections();
1028 mTagWidget =
new MailCommon::TagWidget(actionCollections,
this);
1031 connect(mTagWidget, &TagWidget::changed,
this, &AppearancePageMessageTagTab::slotEmitChangeCheck);
1034 connect(mTagAddLineEdit, &KLineEdit::textChanged,
1039 this, &AppearancePageMessageTagTab::slotNameLineTextChanged);
1041 connect(mTagWidget, &TagWidget::iconNameChanged,
this, &AppearancePageMessageTagTab::slotIconNameChanged);
1043 connect(mTagAddLineEdit, &KLineEdit::returnPressed,
1059 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1070 void AppearancePage::MessageTagTab::slotEmitChangeCheck()
1075 void AppearancePage::MessageTagTab::slotRowsMoved(
const QModelIndex &,
int sourcestart,
int sourceEnd,
const QModelIndex &,
int destinationRow)
1077 Q_UNUSED(sourceEnd);
1078 Q_UNUSED(sourcestart);
1079 Q_UNUSED(destinationRow);
1081 slotEmitChangeCheck();
1084 void AppearancePage::MessageTagTab::updateButtons()
1086 const int currentIndex = mTagListBox->
currentRow();
1088 const bool theFirst = (currentIndex == 0);
1089 const bool theLast = (currentIndex >= (int)mTagListBox->
count() - 1);
1090 const bool aFilterIsSelected = (currentIndex >= 0);
1092 mTagUpButton->
setEnabled(aFilterIsSelected && !theFirst);
1093 mTagDownButton->
setEnabled(aFilterIsSelected && !theLast);
1098 const int tmp_index = mTagListBox->
currentRow();
1099 if (tmp_index <= 0) {
1102 swapTagsInListBox(tmp_index, tmp_index - 1);
1108 const int tmp_index = mTagListBox->
currentRow();
1110 || (tmp_index >=
int(mTagListBox->
count()) - 1)) {
1113 swapTagsInListBox(tmp_index, tmp_index + 1);
1117 void AppearancePage::MessageTagTab::swapTagsInListBox(
const int first,
const int second)
1120 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1124 mPreviousTag = second;
1128 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1129 slotEmitChangeCheck();
1132 void AppearancePage::MessageTagTab::slotRecordTagSettings(
int aIndex)
1134 if ((aIndex < 0) || (aIndex >=
int(mTagListBox->
count()))) {
1140 MailCommon::Tag::Ptr tmp_desc = tagItem->
kmailTag();
1142 tmp_desc->tagName = tagItem->
text();
1143 mTagWidget->recordTagSettings(tmp_desc);
1146 void AppearancePage::MessageTagTab::slotUpdateTagSettingWidgets(
int aIndex)
1149 if ((aIndex < 0) || (mTagListBox->
currentRow() < 0)) {
1154 mTagWidget->setEnabled(
false);
1157 mTagWidget->setEnabled(
true);
1161 mTagDownButton->
setEnabled(((
int(mTagListBox->
count()) - 1) != aIndex));
1164 MailCommon::Tag::Ptr tmp_desc = tagItem->
kmailTag();
1166 disconnect(mTagWidget->tagNameLineEdit(), &KLineEdit::textChanged,
1167 this, &AppearancePage::MessageTagTab::slotNameLineTextChanged);
1169 mTagWidget->tagNameLineEdit()->setEnabled(!tmp_desc->isImmutable);
1170 mTagWidget->tagNameLineEdit()->setText(tmp_desc->tagName);
1171 connect(mTagWidget->tagNameLineEdit(), &KLineEdit::textChanged,
1172 this, &AppearancePage::MessageTagTab::slotNameLineTextChanged);
1174 mTagWidget->setTagTextColor(tmp_desc->textColor);
1176 mTagWidget->setTagBackgroundColor(tmp_desc->backgroundColor);
1178 mTagWidget->setTagTextFormat(tmp_desc->isBold, tmp_desc->isItalic);
1180 mTagWidget->iconButton()->setEnabled(!tmp_desc->isImmutable);
1181 mTagWidget->iconButton()->setIcon(tmp_desc->iconName);
1183 mTagWidget->keySequenceWidget()->setEnabled(
true);
1184 mTagWidget->keySequenceWidget()->setKeySequence(tmp_desc->shortcut,
1185 KKeySequenceWidget::NoValidate);
1187 mTagWidget->inToolBarCheck()->setEnabled(
true);
1188 mTagWidget->inToolBarCheck()->setChecked(tmp_desc->inToolbar);
1191 void AppearancePage::MessageTagTab::slotSelectionChanged()
1194 slotRecordTagSettings(mPreviousTag);
1195 slotUpdateTagSettingWidgets(mTagListBox->
currentRow());
1202 const int tmp_index = mTagListBox->
currentRow();
1203 if (tmp_index >= 0) {
1204 if (KMessageBox::Yes == KMessageBox::questionYesNo(
this, i18n(
"Do you want to remove tag \'%1\'?", mTagListBox->
item(mTagListBox->
currentRow())->text()))) {
1207 MailCommon::Tag::Ptr tmp_desc = tagItem->
kmailTag();
1208 if (tmp_desc->tag().isValid()) {
1209 new Akonadi::TagDeleteJob(tmp_desc->tag());
1211 qCWarning(KMAIL_LOG) <<
"Can't remove tag with invalid akonadi tag";
1219 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1223 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1225 slotSelectionChanged();
1226 slotEmitChangeCheck();
1231 void AppearancePage::MessageTagTab::slotDeleteTagJob(
KJob *job)
1234 qCWarning(KMAIL_LOG) <<
"Failed to delete tag " << job->errorString();
1238 void AppearancePage::MessageTagTab::slotNameLineTextChanged(
const QString &aText)
1246 const int count = mTagListBox->
count();
1247 for (
int i = 0; i < count; ++i) {
1248 if (mTagListBox->
item(i)->
text() == aText) {
1249 KMessageBox::error(
this, i18n(
"We cannot create tag. A tag with same name already exists."));
1251 this, &AppearancePageMessageTagTab::slotNameLineTextChanged);
1252 mTagWidget->tagNameLineEdit()->setText(mTagListBox->
currentItem()->
text());
1254 this, &AppearancePageMessageTagTab::slotNameLineTextChanged);
1262 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1266 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1269 void AppearancePage::MessageTagTab::slotIconNameChanged(
const QString &iconName)
1281 const QString newTagName = mTagAddLineEdit->text().trimmed();
1285 const int count = mTagListBox->
count();
1286 for (
int i = 0; i < count; ++i) {
1287 if (mTagListBox->
item(i)->
text() == newTagName) {
1288 KMessageBox::error(
this, i18n(
"We cannot create tag. A tag with same name already exists."));
1293 const int tmp_priority = mTagListBox->
count();
1295 MailCommon::Tag::Ptr tag(Tag::createDefaultTag(newTagName));
1296 tag->priority = tmp_priority;
1298 slotEmitChangeCheck();
1301 mTagListBox->
addItem(newItem);
1303 mTagAddLineEdit->clear();
1306 void AppearancePage::MessageTagTab::doLoadFromGlobalSettings()
1308 mTagListBox->
clear();
1310 Akonadi::TagFetchJob *fetchJob =
new Akonadi::TagFetchJob(
this);
1311 fetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>();
1312 connect(fetchJob, &KJob::result,
this, &AppearancePageMessageTagTab::slotTagsFetched);
1315 void AppearancePage::MessageTagTab::slotTagsFetched(
KJob *job)
1318 qCWarning(KMAIL_LOG) <<
"Failed to load tags " << job->errorString();
1321 Akonadi::TagFetchJob *fetchJob =
static_cast<Akonadi::TagFetchJob *
>(job);
1324 const Akonadi::Tag::List tagList = fetchJob->tags();
1325 msgTagList.
reserve(tagList.count());
1326 for (
const Akonadi::Tag &akonadiTag : tagList) {
1327 MailCommon::Tag::Ptr tag = MailCommon::Tag::fromAkonadi(akonadiTag);
1331 std::sort(msgTagList.
begin(), msgTagList.
end(), MailCommon::Tag::compare);
1333 for (
const MailCommon::Tag::Ptr &tag : qAsConst(msgTagList)) {
1336 if (tag->priority == -1) {
1337 tag->priority = mTagListBox->
count() - 1;
1343 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1346 this, &AppearancePageMessageTagTab::slotSelectionChanged);
1348 slotUpdateTagSettingWidgets(-1);
1353 mOriginalMsgTagList.
clear();
1361 const int currentRow = mTagListBox->
currentRow();
1362 if (currentRow < 0) {
1366 const int count = mTagListBox->
count();
1375 slotRecordTagSettings(currentRow);
1376 const int numberOfMsgTagList = count;
1377 for (
int i = 0; i < numberOfMsgTagList; ++i) {
1379 if ((i >= mOriginalMsgTagList.
count()) || *(tagItem->
kmailTag()) != *(mOriginalMsgTagList[i])) {
1380 MailCommon::Tag::Ptr tag = tagItem->
kmailTag();
1382 Akonadi::Tag akonadiTag = tag->saveToAkonadi();
1383 if ((*tag).id() > 0) {
1384 akonadiTag.setId((*tag).id());
1386 if (akonadiTag.isValid()) {
1387 new Akonadi::TagModifyJob(akonadiTag);
1389 new Akonadi::TagCreateJob(akonadiTag);
void slotRemoveTag()
Removes the currently selected text in the list box.
AppearancePageGeneralTab(QWidget *parent=nullptr)
void showText(const QPoint &pos, const QString &text, QWidget *w)
DateFormatter::FormatType dateDisplay
static const int numFontNames
Q_REQUIRED_RESULT QString helpAnchor() const
AppearancePageLayoutTab LayoutTab
void setPointSize(int pointSize)
void setContentsMargins(int left, int top, int right, int bottom)
AppearancePageColorsTab ColorsTab
static const struct @1 colorNames[]
void setSuffix(const QString &suffix)
static const int numDateDisplayConfig
AppearancePageLayoutTab(QWidget *parent=nullptr)
AppearancePage(QWidget *parent=nullptr)
void slotAddLineTextChanged(const QString &aText)
Enables/disables Add button according to whether aText is empty.
AppearancePageFontsTab FontsTab
void setDragDropMode(DragDropMode behavior)
void textChanged(const QString &text)
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
static const int numColorNames
static KMKernel * self()
normal control stuff
void setRange(int minimum, int maximum)
Configuration tab in the appearance page for modifying the available set of +message tags...
void setBuddy(QWidget *buddy)
int count(const T &value) const
void rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
void append(const T &value)
void activated(int index)
void slotMoveTagUp()
Increases the currently selected tag's priority and handles related visual changes.
AppearancePageMessageTagTab(QWidget *parent=nullptr)
void linkActivated(const QString &link)
void addTab(ConfigModuleTab *tab, const QString &title)
AppearancePageHeadersTab HeadersTab
void slotAddNewTag()
Creates a generic tag with the visible name from the line edit widget for adding tags.
AppearancePageMessageTagTab MessageTagTab
void setSingleStep(int val)
AppearancePageGeneralTab ReaderTab
AppearancePageFontsTab(QWidget *parent=nullptr)
static const struct @0 fontNames[]
Q_REQUIRED_RESULT QColor color(int index) const
Q_REQUIRED_RESULT QString helpAnchor() const
void setColorSilently(int index, const QColor &color)
static KMailSettings * self()
AppearancePageColorsTab(QWidget *parent=nullptr)
QString helpAnchor() const
void stateChanged(int state)
void addStretch(int stretch)
void setTitle(const QString &title)
QString helpAnchor() const override
Should return the help anchor for this page or tab.
void setFamily(const QString &family)
void setCurrentIndex(int index)
static const struct @2 dateDisplayConfig[]
QString fromLatin1(const char *str, int size)
QIcon fromTheme(const QString &name, const QIcon &fallback)
void addItems(const QStringList &texts)
void slotMoveTagDown()
Decreases the currently selected tag's priority and handles related visual changes.
QAbstractItemModel * model() const
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void addColor(const QString &text, const QColor &color=Qt::black)
Q_REQUIRED_RESULT QString helpAnchor() const
QString helpAnchor() const
~AppearancePageMessageTagTab() override
bool setStretchFactor(QWidget *widget, int stretch)
void setCheckState(Qt::CheckState state)
void setText(const QString &text)
void addLayout(QLayout *layout, int stretch)