SVN_SILENT made messages (.desktop file)
[kdepim.git] / mailcommon / folder / accountconfigorderdialog.cpp
blob8beadf56a745da121416851a43cae14116b14ada
1 /*
2 Copyright (c) 2012-2015 Montel Laurent <montel@kde.org>
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License, version 2, as
6 published by the Free Software Foundation.
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 General Public License for more details.
13 You should have received a copy of the GNU General Public License along
14 with this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #include "accountconfigorderdialog.h"
19 #include "mailcommon/mailcommonsettings_base.h"
20 #include "pimcommon/util/pimutil.h"
21 #include "mailcommon/util/mailutil.h"
22 #include "mailcommon_debug.h"
23 #include <KLocalizedString>
24 #include <QPushButton>
25 #include <QVBoxLayout>
26 #include <QIcon>
28 #include <AkonadiCore/AgentInstance>
29 #include <AkonadiCore/AgentManager>
31 #include <KMime/KMimeMessage>
33 #include <QListWidget>
34 #include <QHBoxLayout>
35 #include <QCheckBox>
36 #include <KConfigGroup>
37 #include <QDialogButtonBox>
39 using namespace MailCommon;
41 struct InstanceStruct {
42 QString name;
43 QIcon icon;
46 AccountConfigOrderDialog::AccountConfigOrderDialog(QWidget *parent)
47 : QDialog(parent)
49 setWindowTitle(i18n("Edit Accounts Order"));
50 QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
51 QVBoxLayout *mainLayout = new QVBoxLayout;
52 setLayout(mainLayout);
53 QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
54 okButton->setDefault(true);
55 okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
56 connect(buttonBox, &QDialogButtonBox::accepted, this, &AccountConfigOrderDialog::accept);
57 connect(buttonBox, &QDialogButtonBox::rejected, this, &AccountConfigOrderDialog::reject);
58 okButton->setDefault(true);
60 QWidget *page = new QWidget(this);
61 mainLayout->addWidget(page);
62 mainLayout->addWidget(buttonBox);
64 QVBoxLayout *vbox = new QVBoxLayout;
65 page->setLayout(vbox);
67 mEnableAccountOrder = new QCheckBox(i18n("Use custom order"));
68 connect(mEnableAccountOrder, &QCheckBox::clicked, this, &AccountConfigOrderDialog::slotEnableAccountOrder);
69 vbox->addWidget(mEnableAccountOrder);
71 QHBoxLayout *vlay = new QHBoxLayout;
72 vbox->addLayout(vlay);
74 mListAccount = new QListWidget(this);
75 mListAccount->setDragDropMode(QAbstractItemView::InternalMove);
76 vlay->addWidget(mListAccount);
78 QWidget *upDownBox = new QWidget(page);
79 QVBoxLayout *upDownBoxVBoxLayout = new QVBoxLayout(upDownBox);
80 upDownBoxVBoxLayout->setMargin(0);
81 mUpButton = new QPushButton(upDownBox);
82 upDownBoxVBoxLayout->addWidget(mUpButton);
83 mUpButton->setIcon(QIcon::fromTheme(QLatin1String("go-up")));
84 mUpButton->setToolTip(i18nc("Move selected account up.", "Up"));
85 mUpButton->setEnabled(false); // b/c no item is selected yet
86 mUpButton->setFocusPolicy(Qt::StrongFocus);
87 mUpButton->setAutoRepeat(true);
89 mDownButton = new QPushButton(upDownBox);
90 upDownBoxVBoxLayout->addWidget(mDownButton);
91 mDownButton->setIcon(QIcon::fromTheme(QLatin1String("go-down")));
92 mDownButton->setToolTip(i18nc("Move selected account down.", "Down"));
93 mDownButton->setEnabled(false); // b/c no item is selected yet
94 mDownButton->setFocusPolicy(Qt::StrongFocus);
95 mDownButton->setAutoRepeat(true);
97 QWidget *spacer = new QWidget(upDownBox);
98 upDownBoxVBoxLayout->addWidget(spacer);
99 upDownBoxVBoxLayout->setStretchFactor(spacer, 100);
100 vlay->addWidget(upDownBox);
102 connect(mUpButton, &QPushButton::clicked, this, &AccountConfigOrderDialog::slotMoveUp);
103 connect(mDownButton, &QPushButton::clicked, this, &AccountConfigOrderDialog::slotMoveDown);
104 connect(mListAccount, &QListWidget::itemSelectionChanged, this, &AccountConfigOrderDialog::slotEnableControls);
105 connect(mListAccount->model(), SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), SLOT(slotEnableControls()));
107 connect(okButton, &QPushButton::clicked, this, &AccountConfigOrderDialog::slotOk);
108 readConfig();
109 init();
112 AccountConfigOrderDialog::~AccountConfigOrderDialog()
114 writeConfig();
117 void AccountConfigOrderDialog::slotEnableAccountOrder(bool state)
119 mListAccount->setEnabled(state);
120 mUpButton->setEnabled(state);
121 mDownButton->setEnabled(state);
122 if (state) {
123 slotEnableControls();
127 void AccountConfigOrderDialog::slotMoveUp()
129 if (!mListAccount->currentItem()) {
130 return;
132 const int pos = mListAccount->row(mListAccount->currentItem());
133 mListAccount->blockSignals(true);
134 QListWidgetItem *item = mListAccount->takeItem(pos);
135 // now selected item is at idx(idx-1), so
136 // insert the other item at idx, ie. above(below).
137 mListAccount->insertItem(pos - 1, item);
138 mListAccount->blockSignals(false);
139 mListAccount->setCurrentRow(pos - 1);
142 void AccountConfigOrderDialog::slotMoveDown()
144 if (!mListAccount->currentItem()) {
145 return;
147 const int pos = mListAccount->row(mListAccount->currentItem());
148 mListAccount->blockSignals(true);
149 QListWidgetItem *item = mListAccount->takeItem(pos);
150 // now selected item is at idx(idx-1), so
151 // insert the other item at idx, ie. above(below).
152 mListAccount->insertItem(pos + 1 , item);
153 mListAccount->blockSignals(false);
154 mListAccount->setCurrentRow(pos + 1);
157 void AccountConfigOrderDialog::slotEnableControls()
159 QListWidgetItem *item = mListAccount->currentItem();
161 mUpButton->setEnabled(item && mListAccount->currentRow() != 0);
162 mDownButton->setEnabled(item && mListAccount->currentRow() != mListAccount->count() - 1);
165 void AccountConfigOrderDialog::init()
167 const QStringList listOrderAccount = MailCommon::MailCommonSettings::self()->order();
168 QStringList instanceList;
170 QMap<QString, InstanceStruct> mapInstance;
171 foreach (const Akonadi::AgentInstance &instance, Akonadi::AgentManager::self()->instances()) {
172 const QStringList capabilities(instance.type().capabilities());
173 if (instance.type().mimeTypes().contains(KMime::Message::mimeType())) {
174 if (capabilities.contains(QLatin1String("Resource")) &&
175 !capabilities.contains(QLatin1String("Virtual")) &&
176 !capabilities.contains(QLatin1String("MailTransport"))) {
177 const QString identifier = instance.identifier();
178 if (!identifier.contains(POP3_RESOURCE_IDENTIFIER)) {
179 instanceList << instance.identifier();
180 InstanceStruct instanceStruct;
181 instanceStruct.name = instance.name();
182 if (PimCommon::Util::isImapResource(identifier)) {
183 instanceStruct.name += QLatin1String(" (IMAP)");
184 } else if (identifier.startsWith(QLatin1String("akonadi_maildir_resource"))) {
185 instanceStruct.name += QLatin1String(" (Maildir)");
186 } else if (identifier.startsWith(QLatin1String("akonadi_mailbox_resource"))) {
187 instanceStruct.name += QLatin1String(" (Mailbox)");
188 } else if (identifier.startsWith(QLatin1String("akonadi_mixedmaildir_resource"))) {
189 instanceStruct.name += QLatin1String(" (Mixedmaildir)");
190 } else {
191 qCDebug(MAILCOMMON_LOG) << " Unknown resource type " << identifier;
193 instanceStruct.icon = instance.type().icon();
194 mapInstance.insert(instance.identifier(), instanceStruct);
199 const int numberOfList(listOrderAccount.count());
200 for (int i = 0; i < numberOfList; ++i) {
201 instanceList.removeOne(listOrderAccount.at(i));
204 QStringList finalList(listOrderAccount);
205 finalList += instanceList;
207 const int numberOfElement(finalList.count());
208 for (int i = 0; i < numberOfElement; ++i) {
209 const QString identifier(finalList.at(i));
210 if (mapInstance.contains(identifier)) {
211 InstanceStruct tmp = mapInstance.value(identifier);
212 QListWidgetItem *item = new QListWidgetItem(tmp.icon, tmp.name, mListAccount);
213 item->setData(AccountConfigOrderDialog::IdentifierAccount, identifier);
214 mListAccount->addItem(item);
217 mEnableAccountOrder->setChecked(MailCommon::MailCommonSettings::self()->enableAccountOrder());
218 slotEnableAccountOrder(MailCommon::MailCommonSettings::self()->enableAccountOrder());
221 void AccountConfigOrderDialog::slotOk()
223 QStringList order;
224 const int numberOfItems(mListAccount->count());
225 for (int i = 0; i < numberOfItems; ++i) {
226 order << mListAccount->item(i)->data(AccountConfigOrderDialog::IdentifierAccount).toString();
229 MailCommon::MailCommonSettings::self()->setOrder(order);
230 MailCommon::MailCommonSettings::self()->setEnableAccountOrder(mEnableAccountOrder->isChecked());
231 MailCommon::MailCommonSettings::self()->save();
232 QDialog::accept();
235 void AccountConfigOrderDialog::readConfig()
237 KConfigGroup accountConfigDialog(MailCommon::MailCommonSettings::self()->config(), "AccountConfigOrderDialog");
238 const QSize size = accountConfigDialog.readEntry("Size", QSize(600, 400));
239 if (size.isValid()) {
240 resize(size);
244 void AccountConfigOrderDialog::writeConfig()
246 KConfigGroup accountConfigDialog(MailCommon::MailCommonSettings::self()->config(), "AccountConfigOrderDialog");
247 accountConfigDialog.writeEntry("Size", size());
248 accountConfigDialog.sync();