1 /***************************************************************************
2 * Copyright (C) 2009 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include "coreaccountsettingspage.h"
24 #include "clientsettings.h"
25 #include "coreaccountmodel.h"
26 #include "iconloader.h"
28 CoreAccountSettingsPage::CoreAccountSettingsPage(QWidget *parent)
29 : SettingsPage(tr("Misc"), tr("Core Accounts"), parent),
31 _lastAutoConnectId(0),
36 ui.addAccountButton->setIcon(SmallIcon("list-add"));
37 ui.editAccountButton->setIcon(SmallIcon("document-edit"));
38 ui.deleteAccountButton->setIcon(SmallIcon("edit-delete"));
40 _model = new CoreAccountModel(Client::coreAccountModel(), this);
41 ui.accountView->setModel(_model);
42 ui.autoConnectAccount->setModel(_model);
44 connect(model(), SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(rowsAboutToBeRemoved(QModelIndex, int, int)));
45 connect(model(), SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(rowsInserted(QModelIndex, int, int)));
47 connect(ui.accountView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(setWidgetStates()));
51 void CoreAccountSettingsPage::setStandAlone(bool standalone) {
52 _standalone = standalone;
55 void CoreAccountSettingsPage::load() {
56 _model->update(Client::coreAccountModel());
59 CoreAccountSettings s;
61 if(Quassel::runMode() != Quassel::Monolithic) {
62 // make sure we don't have selected the internal account as autoconnect account
64 if(s.autoConnectOnStartup() && s.autoConnectToFixedAccount()) {
65 CoreAccount acc = _model->account(s.autoConnectAccount());
67 ui.autoConnectOnStartup->setChecked(false);
70 ui.accountView->setCurrentIndex(model()->index(0, 0));
71 ui.accountView->selectionModel()->select(model()->index(0, 0), QItemSelectionModel::Select);
73 QModelIndex idx = model()->accountIndex(s.autoConnectAccount());
74 ui.autoConnectAccount->setCurrentIndex(idx.isValid() ? idx.row() : 0);
78 void CoreAccountSettingsPage::save() {
80 Client::coreAccountModel()->update(_model);
81 Client::coreAccountModel()->save();
82 CoreAccountSettings s;
85 QVariant CoreAccountSettingsPage::loadAutoWidgetValue(const QString &widgetName) {
86 if(widgetName == "autoConnectAccount") {
87 CoreAccountSettings s;
88 AccountId id = s.autoConnectAccount();
93 return SettingsPage::loadAutoWidgetValue(widgetName);
96 void CoreAccountSettingsPage::saveAutoWidgetValue(const QString &widgetName, const QVariant &v) {
97 CoreAccountSettings s;
98 if(widgetName == "autoConnectAccount") {
99 AccountId id = _model->index(ui.autoConnectAccount->currentIndex(), 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
100 s.setAutoConnectAccount(id);
103 SettingsPage::saveAutoWidgetValue(widgetName, v);
106 // TODO: Qt 4.6 - replace by proper rowsMoved() semantics
107 void CoreAccountSettingsPage::rowsAboutToBeRemoved(const QModelIndex &index, int start, int end) {
108 _lastAutoConnectId = _lastAccountId = 0;
109 if(index.isValid() || start != end)
112 // the current index is removed, so remember it in case it's reinserted immediately afterwards
113 AccountId id = model()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
114 if(start == ui.accountView->currentIndex().row())
116 if(start == ui.autoConnectAccount->currentIndex())
117 _lastAutoConnectId = id;
120 void CoreAccountSettingsPage::rowsInserted(const QModelIndex &index, int start, int end) {
121 if(index.isValid() || start != end)
124 // check if the inserted index was just removed and select it in that case
125 AccountId id = model()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
126 if(id == _lastAccountId)
127 ui.accountView->setCurrentIndex(model()->index(start, 0));
128 if(id == _lastAutoConnectId)
129 ui.autoConnectAccount->setCurrentIndex(start);
130 _lastAccountId = _lastAutoConnectId = 0;
133 AccountId CoreAccountSettingsPage::selectedAccount() const {
134 QModelIndex index = ui.accountView->currentIndex();
137 return index.data(CoreAccountModel::AccountIdRole).value<AccountId>();
140 void CoreAccountSettingsPage::setSelectedAccount(AccountId accId) {
141 QModelIndex index = model()->accountIndex(accId);
143 ui.accountView->setCurrentIndex(index);
146 void CoreAccountSettingsPage::on_addAccountButton_clicked() {
147 CoreAccountEditDlg dlg(CoreAccount(), this);
148 if(dlg.exec() == QDialog::Accepted) {
149 AccountId id =_model->createOrUpdateAccount(dlg.account());
150 ui.accountView->setCurrentIndex(model()->accountIndex(id));
155 void CoreAccountSettingsPage::on_editAccountButton_clicked() {
156 QModelIndex idx = ui.accountView->selectionModel()->currentIndex();
163 void CoreAccountSettingsPage::editAccount(const QModelIndex &index) {
167 CoreAccountEditDlg dlg(_model->account(index), this);
168 if(dlg.exec() == QDialog::Accepted) {
169 AccountId id = _model->createOrUpdateAccount(dlg.account());
170 ui.accountView->setCurrentIndex(model()->accountIndex(id));
175 void CoreAccountSettingsPage::on_deleteAccountButton_clicked() {
176 if(!ui.accountView->selectionModel()->selectedIndexes().count())
178 AccountId id = ui.accountView->selectionModel()->selectedIndexes().at(0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
180 model()->removeAccount(id);
185 void CoreAccountSettingsPage::on_accountView_doubleClicked(const QModelIndex &index) {
190 emit connectToCore(index.data(CoreAccountModel::AccountIdRole).value<AccountId>());
195 void CoreAccountSettingsPage::setWidgetStates() {
196 AccountId accId = selectedAccount();
197 bool editable = accId.isValid() && accId != model()->internalAccount();
199 ui.editAccountButton->setEnabled(editable);
200 ui.deleteAccountButton->setEnabled(editable);
203 void CoreAccountSettingsPage::widgetHasChanged() {
204 setChangedState(testHasChanged());
208 bool CoreAccountSettingsPage::testHasChanged() {
209 if(!(*model() == *Client::coreAccountModel()))
215 /*****************************************************************************************
217 *****************************************************************************************/
218 CoreAccountEditDlg::CoreAccountEditDlg(const CoreAccount &acct, QWidget *parent)
225 ui.hostName->setText(acct.hostName());
226 ui.port->setValue(acct.port());
227 ui.accountName->setText(acct.accountName());
228 ui.user->setText(acct.user());
229 ui.password->setText(acct.password());
230 ui.rememberPassword->setChecked(acct.storePassword());
231 ui.useProxy->setChecked(acct.useProxy());
232 ui.proxyHostName->setText(acct.proxyHostName());
233 ui.proxyPort->setValue(acct.proxyPort());
234 ui.proxyType->setCurrentIndex(acct.proxyType() == QNetworkProxy::Socks5Proxy ? 0 : 1);
235 ui.proxyUser->setText(acct.proxyUser());
236 ui.proxyPassword->setText(acct.proxyPassword());
238 if(acct.accountId().isValid())
239 setWindowTitle(tr("Edit Core Account"));
241 setWindowTitle(tr("Add Core Account"));
244 CoreAccount CoreAccountEditDlg::account() {
245 _account.setAccountName(ui.accountName->text().trimmed());
246 _account.setHostName(ui.hostName->text().trimmed());
247 _account.setPort(ui.port->value());
248 _account.setUser(ui.user->text().trimmed());
249 _account.setPassword(ui.password->text());
250 _account.setStorePassword(ui.rememberPassword->isChecked());
251 _account.setUseProxy(ui.useProxy->isChecked());
252 _account.setProxyHostName(ui.proxyHostName->text().trimmed());
253 _account.setProxyPort(ui.proxyPort->value());
254 _account.setProxyType(ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy);
255 _account.setProxyUser(ui.proxyUser->text().trimmed());
256 _account.setProxyPassword(ui.proxyPassword->text());
260 void CoreAccountEditDlg::setWidgetStates() {
261 bool ok = !ui.accountName->text().trimmed().isEmpty()
262 && !ui.user->text().trimmed().isEmpty()
263 && !ui.hostName->text().isEmpty();
264 ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok);
267 void CoreAccountEditDlg::on_hostName_textChanged(const QString &text) {
272 void CoreAccountEditDlg::on_accountName_textChanged(const QString &text) {
277 void CoreAccountEditDlg::on_user_textChanged(const QString &text) {