/* Copyright 2010-2012 Grégory Soutadé This file is part of KissCount. KissCount 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 3 of the License, or (at your option) any later version. KissCount 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 KissCount. If not, see . */ #include "PasswordDialog.hpp" #include "PreferencesPanel.hpp" #include "grid/StarDelegate.hpp" enum {ACCOUNT_NAME, ACCOUNT_NUMBER, ACCOUNT_DEFAULT, ACCOUNT_VIRTUAL, ACCOUNT_BLOCKED, ACCOUNT_DELETE, ACCOUNT_HIDDEN, NUMBER_COLS_ACCOUNT}; enum {CATEGORY_NAME, CATEGORY_BACKGROUND_COLOR, CATEGORY_FOREGROUND_COLOR, CATEGORY_FONT, CATEGORY_DELETE, NUMBER_COLS_CATEGORY}; PreferencesPanel::PreferencesPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent), _sharedWith(0), _curAccountRow(-1), _defaultSignalMapper(this), _virtualSignalMapper(this), _blockedSignalMapper(this), _deleteAccountSignalMapper(this), _deleteCategorySignalMapper(this), _backgroundColorSignalMapper(this), _foregroundColorSignalMapper(this), _fontSignalMapper(this), _inModification(false) { QVBoxLayout *vbox = new QVBoxLayout; QHBoxLayout *hbox1 = new QHBoxLayout; QHBoxLayout *hbox2 = new QHBoxLayout; //QHBoxLayout *hbox = new QHBoxLayout; QGroupBox* staticUser, *staticAccount, *staticCategories, *staticLanguage, *staticOperationOrder, *staticSharedWith; User* user = _kiss->GetUser(); QGridLayout *gridBagSizer; QLabel* label; QPushButton* buttonChangeName, *buttonChangePassword, *killMe; QVBoxLayout * staticBoxSizer; std::list users; std::list::iterator it; setLayout(vbox); staticUser = new QGroupBox(_("User")); staticAccount = new QGroupBox(_("Accounts")); staticCategories = new QGroupBox(_("Categories")); staticLanguage = new QGroupBox(_("Language")); staticOperationOrder = new QGroupBox(_("Operation order")); staticSharedWith = new QGroupBox(_("Shared with")); // User staticBoxSizer = new QVBoxLayout (); staticUser->setLayout(staticBoxSizer); gridBagSizer = new QGridLayout(); label = new QLabel(_("Name")); gridBagSizer->addWidget(label, 0, 0); _name = new QLineEdit(user->_name); gridBagSizer->addWidget(_name, 0, 1); buttonChangeName = new QPushButton(_("Change Name")); buttonChangePassword = new QPushButton(_("Change Password")); killMe = new QPushButton(_("Kill me")); gridBagSizer->addWidget(buttonChangeName, 1, 0); gridBagSizer->addWidget(buttonChangePassword, 1, 1); gridBagSizer->addWidget(killMe, 1, 2); staticBoxSizer->addLayout(gridBagSizer); vbox->addWidget(staticUser); connect(buttonChangeName, SIGNAL(clicked()), this, SLOT(OnChangeName())); connect(buttonChangePassword, SIGNAL(clicked()), this, SLOT(OnChangePassword())); connect(killMe, SIGNAL(clicked()), this, SLOT(OnKillMe())); // Account staticBoxSizer = new QVBoxLayout (); staticAccount->setLayout(staticBoxSizer); _accountsGrid = new QTableWidget(); StarDelegate* starDelegate = new StarDelegate(this, &user->_accounts); _accountsGrid->setItemDelegateForColumn(ACCOUNT_NUMBER, starDelegate); InitAccounts(user); connect(_accountsGrid, SIGNAL(cellChanged(int, int)), this, SLOT(OnAccountModified(int, int))); connect(_accountsGrid, SIGNAL(currentCellChanged(int, int, int, int)), this, SLOT(OnAccountCellChanged(int, int, int, int))); staticBoxSizer->addWidget(_accountsGrid); hbox1->addWidget(staticAccount); staticBoxSizer = new QVBoxLayout (); staticSharedWith->setLayout(staticBoxSizer); _sharedWith = new QListWidget(); users = _kiss->GetUsers(); QListWidgetItem* item; for(it=users.begin(); it!=users.end(); it++) { if (*it != user->_name) { item = new QListWidgetItem(*it); item->setCheckState(Qt::Unchecked); _sharedWith->addItem(item); } } _sharedWith->setEnabled(false); connect(_sharedWith, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(OnSharedChange(QListWidgetItem *))); staticBoxSizer->addWidget(_sharedWith); hbox1->addWidget(staticSharedWith); vbox->addLayout(hbox1); // Categories staticBoxSizer = new QVBoxLayout (); staticCategories->setLayout(staticBoxSizer); _categoriesGrid = new QTableWidget(); staticBoxSizer->addWidget(_categoriesGrid); InitCategories(user); connect(_categoriesGrid, SIGNAL(cellChanged(int, int)), this, SLOT(OnCategoryModified(int, int))); vbox->addWidget(staticCategories); // Operation Order staticBoxSizer = new QVBoxLayout (); staticOperationOrder->setLayout(staticBoxSizer); _operationOrder = new QComboBox(); //_operationOrder->SetWindowStyle(wxCB_READONLY); InitOperationOrder(user); staticBoxSizer->addWidget(_operationOrder); hbox2->addWidget(staticOperationOrder); connect(_operationOrder, SIGNAL(currentIndexChanged(int)), this, SLOT(OnOperationOrderChange(int))); // Language staticBoxSizer = new QVBoxLayout (); staticLanguage->setLayout(staticBoxSizer); _language = new QListWidget(); //_language->SetWindowStyle(wxCB_READONLY); connect(_language, SIGNAL(currentRowChanged(int)), this, SLOT(OnLanguageChange(int))); staticBoxSizer->addWidget(_language); hbox2->addWidget(staticLanguage); vbox->addLayout(hbox2); connect(&_defaultSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnAccountDefaultClicked(int))); connect(&_virtualSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnAccountVirtualClicked(int))); connect(&_blockedSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnAccountBlockedClicked(int))); connect(&_deleteAccountSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnAccountDeleteClicked(int))); connect(&_hiddenAccountSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnAccountHiddenClicked(int))); connect(&_deleteCategorySignalMapper, SIGNAL(mapped(int)), this, SLOT(OnCategoryDeleteClicked(int))); connect(&_backgroundColorSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnBackgroundColorClicked(int))); connect(&_foregroundColorSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnForegroundClicked(int))); connect(&_fontSignalMapper, SIGNAL(mapped(int)), this, SLOT(OnFontClicked(int))); layout(); } KissPanel* PreferencesPanel::CreatePanel() { return new PreferencesPanel(_kiss, _wxUI); } QPushButton* PreferencesPanel::GetButton() { if (!_KissButton) { _KissButton = new QPushButton(QIcon(PREFS_ICON), "", this); _KissButton->setFixedSize(128, 128); _KissButton->setIconSize(QSize(128, 128)); } return _KissButton; } QString PreferencesPanel::GetToolTip() { return _("Preferences"); } void PreferencesPanel::InitAccounts(User* user) { std::vector::iterator it; int curLine = 0; Account account ; DEFAULT_FONT(font); _accountsGrid->setColumnCount(NUMBER_COLS_ACCOUNT); _accountsGrid->verticalHeader()->setHidden(true); _accountsGrid->setFont(font); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_NAME, new QTableWidgetItem(_("Name"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_NUMBER, new QTableWidgetItem(_("Number"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_DEFAULT, new QTableWidgetItem(_("Default"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_VIRTUAL, new QTableWidgetItem(_("Virtual"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_BLOCKED, new QTableWidgetItem(_("Blocked"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_DELETE, new QTableWidgetItem(_("Delete"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_HIDDEN, new QTableWidgetItem(_("Hidden"))); font.setBold(true); for(int i=0; ihorizontalHeaderItem(i)->setFont(font); } _accountsGrid->setRowCount(user->GetAccountsNumber()+1); for (it = user->_accounts.begin(); it != user->_accounts.end(); it++, curLine++) { AddAccount(curLine, *it); } account.id = 0; AddAccount(curLine, account); } #define SET_READ_ONLY(row, line) _accountsGrid->item(row, line)->setFlags(_accountsGrid->item(row, line)->flags() & ~Qt::ItemIsEditable); void PreferencesPanel::AddAccount(int line, Account ac) { QCheckBox* checkBox; if (ac.id != 0) { _accountsGrid->setItem(line, ACCOUNT_NAME, new QTableWidgetItem(ac.name)); if (ac.shared) _accountsGrid->setItem(line, ACCOUNT_NUMBER, new QTableWidgetItem(ac.number + "*")); else _accountsGrid->setItem(line, ACCOUNT_NUMBER, new QTableWidgetItem(ac.number)); checkBox = new QCheckBox(); checkBox->setCheckState((ac._default) ? Qt::Checked : Qt::Unchecked); _accountsGrid->setCellWidget(line, ACCOUNT_DEFAULT, checkBox); _defaultSignalMapper.setMapping(checkBox, ac.id); connect(checkBox, SIGNAL(stateChanged(int)), &_defaultSignalMapper, SLOT(map())); checkBox = new QCheckBox(); checkBox->setCheckState((ac._virtual) ? Qt::Checked : Qt::Unchecked); _accountsGrid->setCellWidget(line, ACCOUNT_VIRTUAL, checkBox); _virtualSignalMapper.setMapping(checkBox, ac.id); connect(checkBox, SIGNAL(stateChanged(int)), &_virtualSignalMapper, SLOT(map())); checkBox = new QCheckBox(); checkBox->setCheckState((ac.blocked) ? Qt::Checked : Qt::Unchecked); _accountsGrid->setCellWidget(line, ACCOUNT_BLOCKED, checkBox); _blockedSignalMapper.setMapping(checkBox, ac.id); connect(checkBox, SIGNAL(stateChanged(int)), &_blockedSignalMapper, SLOT(map())); checkBox = new QCheckBox(); checkBox->setCheckState(Qt::Unchecked); _accountsGrid->setCellWidget(line, ACCOUNT_DELETE, checkBox); _deleteAccountSignalMapper.setMapping(checkBox, ac.id); connect(checkBox, SIGNAL(stateChanged(int)), &_deleteAccountSignalMapper, SLOT(map())); checkBox = new QCheckBox(); checkBox->setCheckState((ac.hidden) ? Qt::Checked : Qt::Unchecked); _accountsGrid->setCellWidget(line, ACCOUNT_HIDDEN, checkBox); _hiddenAccountSignalMapper.setMapping(checkBox, ac.id); connect(checkBox, SIGNAL(stateChanged(int)), &_hiddenAccountSignalMapper, SLOT(map())); for(int i=0; iitem(line, i)) _accountsGrid->setItem(line, i, new QTableWidgetItem("")); // _accountsGrid->SetCellAlignment(line, ACCOUNT_DEFAULT, wxALIGN_CENTRE, wxALIGN_CENTRE); // _accountsGrid->SetCellAlignment(line, ACCOUNT_VIRTUAL, wxALIGN_CENTRE, wxALIGN_CENTRE); // _accountsGrid->SetCellAlignment(line, ACCOUNT_BLOCKED, wxALIGN_CENTRE, wxALIGN_CENTRE); // _accountsGrid->SetCellAlignment(line, ACCOUNT_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); if (!ac.is_owner) { SET_READ_ONLY(line, ACCOUNT_NAME); SET_READ_ONLY(line, ACCOUNT_NUMBER); SET_READ_ONLY(line, ACCOUNT_DEFAULT); SET_READ_ONLY(line, ACCOUNT_VIRTUAL); SET_READ_ONLY(line, ACCOUNT_BLOCKED); SET_READ_ONLY(line, ACCOUNT_HIDDEN); } else { SET_READ_ONLY(line, ACCOUNT_DEFAULT); SET_READ_ONLY(line, ACCOUNT_VIRTUAL); SET_READ_ONLY(line, ACCOUNT_BLOCKED); SET_READ_ONLY(line, ACCOUNT_DELETE); } } else { for(int i=0; iitem(line, i)) _accountsGrid->setItem(line, i, new QTableWidgetItem("")); SET_READ_ONLY(line, ACCOUNT_DEFAULT); SET_READ_ONLY(line, ACCOUNT_VIRTUAL); SET_READ_ONLY(line, ACCOUNT_BLOCKED); SET_READ_ONLY(line, ACCOUNT_DELETE); SET_READ_ONLY(line, ACCOUNT_HIDDEN); } _accountsGrid->resizeColumnsToContents(); } #undef SET_READ_ONLY #define SET_READ_ONLY(row, line) _categoriesGrid->item(row, line)->setFlags(_categoriesGrid->item(row, line)->flags() & ~Qt::ItemIsEditable); #define SET_ROW_COLOR(row, backcolor, forecolor) \ for(int i=0; iitem(row, i)->setBackground(QBrush(backcolor)); \ _categoriesGrid->item(row, i)->setForeground(QBrush(forecolor)); \ } #define SET_ROW_FONT(row, font) \ for(int i=0; iitem(row, i)->setFont(font); \ } void PreferencesPanel::InitCategories(User* user) { std::vector::iterator it; int curLine = 0; DEFAULT_FONT(font); Category cat; _categoriesGrid->setColumnCount(NUMBER_COLS_CATEGORY); _categoriesGrid->verticalHeader()->setHidden(true); _categoriesGrid->setFont(font); _categoriesGrid->setHorizontalHeaderItem(CATEGORY_NAME, new QTableWidgetItem(_("Name"))); _categoriesGrid->setHorizontalHeaderItem(CATEGORY_BACKGROUND_COLOR, new QTableWidgetItem(_("Background color"))); _categoriesGrid->setHorizontalHeaderItem(CATEGORY_FOREGROUND_COLOR, new QTableWidgetItem(_("Foreground color"))); _categoriesGrid->setHorizontalHeaderItem(CATEGORY_FONT, new QTableWidgetItem(_("Font"))); _categoriesGrid->setHorizontalHeaderItem(CATEGORY_DELETE, new QTableWidgetItem(_("Delete"))); _categoriesGrid->setRowCount(user->GetCategoriesNumber()+1); font.setBold(true); for(int i=0; ihorizontalHeaderItem(i)->setFont(font); } for (it=user->_categories.begin(); it!=user->_categories.end(); it++, curLine++) { AddCategory(curLine, *it); } for(int i=0; iitem(curLine, i)) _categoriesGrid->setItem(curLine, i, new QTableWidgetItem("")); SET_READ_ONLY(curLine, CATEGORY_BACKGROUND_COLOR); SET_READ_ONLY(curLine, CATEGORY_FOREGROUND_COLOR); SET_READ_ONLY(curLine, CATEGORY_FONT); SET_READ_ONLY(curLine, CATEGORY_DELETE); cat.id = 0; AddCategory(curLine, cat); } void PreferencesPanel::AddCategory(int line, Category cat) { User* user = _kiss->GetUser(); QCheckBox* checkBox; QPushButton* button; if (cat.id != 0) { _categoriesGrid->setItem(line, CATEGORY_NAME, new QTableWidgetItem(_(cat.name.toStdString().c_str()))); if (line) { checkBox = new QCheckBox(); checkBox->setCheckState(Qt::Unchecked); _categoriesGrid->setCellWidget(line, CATEGORY_DELETE, checkBox); _deleteCategorySignalMapper.setMapping(checkBox, cat.id); connect(checkBox, SIGNAL(stateChanged(int)), &_deleteCategorySignalMapper, SLOT(map())); } button = new QPushButton("..."); _categoriesGrid->setCellWidget(line, CATEGORY_BACKGROUND_COLOR, button); _backgroundColorSignalMapper.setMapping(button, cat.id); connect(button, SIGNAL(clicked()), &_backgroundColorSignalMapper, SLOT(map())); button = new QPushButton("..."); _categoriesGrid->setCellWidget(line, CATEGORY_FOREGROUND_COLOR, button); _foregroundColorSignalMapper.setMapping(button, cat.id); connect(button, SIGNAL(clicked()), &_foregroundColorSignalMapper, SLOT(map())); button = new QPushButton("..."); _categoriesGrid->setCellWidget(line, CATEGORY_FONT, button); _fontSignalMapper.setMapping(button, cat.id); connect(button, SIGNAL(clicked()), &_fontSignalMapper, SLOT(map())); for(int i=0; iitem(line, i) == 0) _categoriesGrid->setItem(line, i, new QTableWidgetItem("")); SET_ROW_COLOR(line, cat.backcolor, cat.forecolor); if (cat.font.size()) { QFont font = user->GetCategoryFont(cat.id); SET_ROW_FONT(line, font); } // _categoriesGrid->SetCellAlignment(line, CATEGORY_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); } else { for(int i=0; iitem(line, i)) _categoriesGrid->setItem(line, i, new QTableWidgetItem("")); SET_READ_ONLY(line, CATEGORY_BACKGROUND_COLOR); SET_READ_ONLY(line, CATEGORY_FOREGROUND_COLOR); SET_READ_ONLY(line, CATEGORY_FONT); SET_READ_ONLY(line, CATEGORY_DELETE); SET_ROW_COLOR(line, view::OWN_GREEN, Qt::black); _categoriesGrid->resizeColumnsToContents(); } } void PreferencesPanel::InitLanguage(User* user) { int i, select=0; QListWidgetItem* item; if (_inModification) return; _inModification = true; _language->clear(); for (i=0; isetIcon(QIcon(SupportedLanguages::languages[i].icon)), _language->addItem(item); if (SupportedLanguages::languages[i].name == _wxUI->_curLanguage.name) select = i; } _language->setCurrentRow(select); _inModification = false; } void PreferencesPanel::InitOperationOrder(User* user) { _operationOrder->addItem(_("Ascending")); _operationOrder->addItem(_("Descending")); if (user->_preferences["operation_order"] == "ASC") _operationOrder->setCurrentIndex(0); else _operationOrder->setCurrentIndex(1); } void PreferencesPanel::OnAccountDefaultClicked(int id) { User* user = _kiss->GetUser(); QCheckBox* checkBox = qobject_cast (_defaultSignalMapper.mapping(id)); std::vector::iterator it; int i, row; Account account; if (_inModification) return; it = std::find(user->_accounts.begin(), user->_accounts.end(), id); if (it == user->_accounts.end()) return ; row = it-user->_accounts.begin(); account = user->_accounts[row]; _inModification = true; if (account._default) { checkBox->setCheckState(Qt::Checked); _inModification = false; return; } account._default = true; _kiss->UpdateAccount(account); for (i=0; iGetAccountsNumber(); i++) { if (i != row) { account = user->_accounts[i]; if (account._default) { account._default = false; _kiss->UpdateAccount(account); checkBox = qobject_cast(_accountsGrid->cellWidget(i, ACCOUNT_DEFAULT)); checkBox->setCheckState(Qt::Unchecked); break; } } } account = user->_accounts[row]; _inModification = false; _wxUI->NeedReload(); } void PreferencesPanel::OnAccountVirtualClicked(int id) { User* user = _kiss->GetUser(); QCheckBox* checkBox = qobject_cast (_virtualSignalMapper.mapping(id)); std::vector::iterator it; Account account; int row; if (_inModification) return; it = std::find(user->_accounts.begin(), user->_accounts.end(), id); if (it == user->_accounts.end()) return ; _inModification = true; row = it-user->_accounts.begin(); account = user->_accounts[row]; account._virtual = (checkBox->checkState() == Qt::Checked); _kiss->UpdateAccount(account); _inModification = false; _wxUI->NeedReload(); } void PreferencesPanel::OnAccountBlockedClicked(int id) { User* user = _kiss->GetUser(); QCheckBox* checkBox = qobject_cast (_blockedSignalMapper.mapping(id)); std::vector::iterator it; Account account; int row; if (_inModification) return; it = std::find(user->_accounts.begin(), user->_accounts.end(), id); if (it == user->_accounts.end()) return ; _inModification = true; row = it-user->_accounts.begin(); account = user->_accounts[row]; account.blocked = (checkBox->checkState() == Qt::Checked); _kiss->UpdateAccount(account); _inModification = false; _wxUI->NeedReload(); } void PreferencesPanel::OnAccountDeleteClicked(int id) { User* user = _kiss->GetUser(); std::vector::iterator it; int i, row; QStringList accounts; QString res; QCheckBox* checkBox = qobject_cast (_deleteAccountSignalMapper.mapping(id)); Account account; bool ok, default_account; if (user->GetAccountsNumber() == 1) { QMessageBox::critical(0, _("Error"), _("It must be at least one account !")); checkBox->setCheckState(Qt::Unchecked); return; } it = std::find(user->_accounts.begin(), user->_accounts.end(), id); if (it == user->_accounts.end()) return ; if (_inModification) return; _inModification = true; row = it-user->_accounts.begin(); account = user->_accounts[row]; accounts << _("None"); for(i=0; i < user->GetAccountsNumber(); i++) if (user->_accounts[i].id != id) accounts << user->_accounts[i].name; res = QInputDialog::getItem(0, "KissCount", _("Wich account will replace this one ?"), accounts, 0, false, &ok); if (!ok) { checkBox->setCheckState(Qt::Unchecked); _inModification = false; return; } else { i = accounts.indexOf(res); default_account = user->_accounts[i]._default; _kiss->DeleteAccount(account, (!i) ? 0 : user->GetAccountId(accounts[i])); _accountsGrid->removeRow(row); } if (default_account) { user->_accounts[0]._default = true; user->_accounts[0].hidden = false; _kiss->UpdateAccount(user->_accounts[0]); checkBox = qobject_cast (_accountsGrid->cellWidget(0, ACCOUNT_DEFAULT)); checkBox->setCheckState(Qt::Checked); checkBox = qobject_cast (_accountsGrid->cellWidget(0, ACCOUNT_HIDDEN)); checkBox->setCheckState(Qt::Unchecked); } _inModification = false; _wxUI->NeedReload(); } void PreferencesPanel::OnAccountHiddenClicked(int id) { User* user = _kiss->GetUser(); QCheckBox* checkBox = qobject_cast (_hiddenAccountSignalMapper.mapping(id)); std::vector::iterator it; Account account; int row; if (_inModification) return; _inModification = true; it = std::find(user->_accounts.begin(), user->_accounts.end(), id); if (it == user->_accounts.end()) return ; row = it-user->_accounts.begin(); account = user->_accounts[row]; if (account._default) { QMessageBox::critical(0, _("Error"), _("Default account cannot be hidden")); checkBox->setCheckState(Qt::Unchecked); _inModification = false; return; } account.hidden = (checkBox->checkState() == Qt::Checked); _kiss->UpdateAccount(account); _inModification = false; _wxUI->NeedReload(); } void PreferencesPanel::OnCategoryDeleteClicked(int id) { QStringList categories; int i, row; QString res; User* user = _kiss->GetUser(); bool ok; QCheckBox* checkBox = qobject_cast (_deleteCategorySignalMapper.mapping(id)); Category category; std::vector::iterator it; if (_inModification) return; it = std::find(user->_categories.begin(), user->_categories.end(), id); if (it == user->_categories.end()) return ; _inModification = true; row = it-user->_categories.begin(); category = user->_categories[row]; categories << _("None"); for(i=0; i < user->GetCategoriesNumber(); i++) if (user->_categories[i].id != id) categories << _(user->_categories[i].name.toStdString().c_str()); res = QInputDialog::getItem(0, "KissCount", _("Wich category will replace this one ?"), categories, 0, false, &ok); if (!ok) { checkBox->setCheckState(Qt::Unchecked); _inModification = false; return; } else { i = categories.indexOf(res); _kiss->DeleteCategory(category, (!i) ? 0 : user->GetCategoryId(categories[i])); _categoriesGrid->removeRow(row); _wxUI->NeedReload(); } _inModification = false; } void PreferencesPanel::OnBackgroundColorClicked(int id) { User* user = _kiss->GetUser(); QColor color; std::vector::iterator it; int row; if (_inModification) return; it = std::find(user->_categories.begin(), user->_categories.end(), id); if (it == user->_categories.end()) return ; row = it-user->_categories.begin(); _inModification = true ; color = QColorDialog::getColor(user->_categories[row].backcolor); if (color.isValid()) { user->_categories[row].backcolor = color; _kiss->UpdateCategory(user->_categories[row]); SET_ROW_COLOR(row, user->_categories[row].backcolor, user->_categories[row].forecolor); _wxUI->NeedReload(); } _inModification = false ; } void PreferencesPanel::OnForegroundClicked(int id) { User* user = _kiss->GetUser(); QColor color; std::vector::iterator it; int row; if (_inModification) return; it = std::find(user->_categories.begin(), user->_categories.end(), id); if (it == user->_categories.end()) return ; row = it-user->_categories.begin(); _inModification = true ; color = QColorDialog::getColor(user->_categories[row].forecolor); if (color.isValid()) { user->_categories[row].forecolor = color; _kiss->UpdateCategory(user->_categories[row]); SET_ROW_COLOR(row, user->_categories[row].backcolor, user->_categories[row].forecolor); _wxUI->NeedReload(); } _inModification = false ; } void PreferencesPanel::OnFontClicked(int id) { User* user = _kiss->GetUser(); bool ok; QFont font; std::vector::iterator it; int row; if (_inModification) return; it = std::find(user->_categories.begin(), user->_categories.end(), id); if (it == user->_categories.end()) return ; row = it-user->_categories.begin(); _inModification = true ; font = QFontDialog::getFont(&ok, user->_categories[row].font); if (ok) { user->_categories[row].font = KissCount::CompactFont(font); _kiss->UpdateCategory(user->_categories[row]); SET_ROW_FONT(row, font); _wxUI->NeedReload(); } _inModification = false ; } void PreferencesPanel::OnAccountModified(int row, int col) { int op_complete = 1, new_id; QString value ; Account new_account, account; User* user = _kiss->GetUser(); if (_inModification) return; _inModification = true; value = _accountsGrid->item(row, ACCOUNT_NAME)->text(); if (value.size()) { new_account.name = value; op_complete--; } value = _accountsGrid->item(row, ACCOUNT_NUMBER)->text(); if (value.size()) { new_account.number = value; op_complete--; } // Account modification if (user->GetAccountsNumber() && row < user->GetAccountsNumber()) { new_account._default = user->_accounts[row]._default; new_account.id = user->_accounts[row].id; new_account.shared = user->_accounts[row].shared; new_account.is_owner = user->_accounts[row].is_owner; new_account.blocked = user->_accounts[row].blocked; new_account._virtual = user->_accounts[row]._virtual; new_account.hidden = user->_accounts[row].hidden; if (col == ACCOUNT_NAME) { try { new_id = user->GetAccountId(new_account.name); if (new_id != new_account.id) { QMessageBox::critical(0, _("Error"), _("Account ")+new_account.name+_(" already exists")); _accountsGrid->setItem(row, ACCOUNT_NAME, new QTableWidgetItem(user->_accounts[row].name)); _inModification = false; return ; } } catch(User::AccountNotFound e) {} } _kiss->UpdateAccount(new_account); } // New account else { if (op_complete) { _inModification = false; return ; } try { user->GetAccountId(new_account.name); QMessageBox::critical(0, _("Error"), _("Account ")+new_account.name+_(" already exists")); _inModification = false; return ; } catch (User::AccountNotFound e) {} new_account._default = false; new_account.shared = false; new_account.blocked = false; new_account.is_owner = true; new_account._virtual = false; new_account.hidden = false; _kiss->AddAccount(new_account); AddAccount(row, new_account); new_account.id = 0; _accountsGrid->setRowCount(row+2); AddAccount(row+1, new_account); } _accountsGrid->resizeColumnsToContents(); _wxUI->NeedReload(); _inModification = false; } void PreferencesPanel::OnAccountCellChanged(int row, int col, int previousRow, int previousCol) { User* user = _kiss->GetUser(); std::map::iterator it; int i; bool own; QString owner; QListWidgetItem* item; if (!_sharedWith || _curAccountRow == row) return ; _curAccountRow = row ; if (row >= (int) user->_accounts.size()) { for(i=0; i<(int)_sharedWith->count(); i++) _sharedWith->item(i)->setCheckState(Qt::Unchecked); own = false; } else { _sharedOwners = _kiss->getSharedAccountOwners(user->_accounts[row].id); owner = _kiss->getSharedAccountOwner(user->_accounts[row].id); for(i=0; i<(int)_sharedWith->count(); i++) { item = _sharedWith->item(i); item->setCheckState((_sharedOwners[item->text()].size() > 0 || item->text() == owner) ? Qt::Checked : Qt::Unchecked); } own = user->_accounts[row].is_owner; } _sharedWith->setEnabled(own); } void PreferencesPanel::OnSharedChange(QListWidgetItem *item) { User* user = _kiss->GetUser(); if (_inModification) return; _inModification = true; if (item->checkState() == Qt::Checked) { if (!user->_accounts[_curAccountRow].shared) _accountsGrid->setItem(_curAccountRow, ACCOUNT_NUMBER, new QTableWidgetItem(user->_accounts[_curAccountRow].number + "*")); _kiss->AddSharedAccount(user->_accounts[_curAccountRow], item->text()); } else { _kiss->RemoveSharedAccount(user->_accounts[_curAccountRow], _sharedOwners[item->text()].toInt()); if (!user->_accounts[_curAccountRow].shared) _accountsGrid->setItem(_curAccountRow, ACCOUNT_NUMBER, new QTableWidgetItem(user->_accounts[_curAccountRow].number)); } _inModification = false; _wxUI->NeedReload(); } void PreferencesPanel::OnCategoryModified(int row, int col) { int op_complete = 1; QString value; User* user = _kiss->GetUser(); Category new_cat, old_cat; int new_id; QTableWidgetItem* item = _categoriesGrid->item(row, col); if (_inModification) return; _inModification = true; value = item->text(); if (value.size()) { new_cat.name = value; op_complete--; } new_cat.backcolor = item->background().color(); new_cat.forecolor = item->foreground().color(); new_cat.font = ""; new_cat.parent = 0; // Categories modification if (user->GetCategoriesNumber() && row < user->GetCategoriesNumber()) { old_cat = user->_categories[row]; new_cat.id = user->_categories[row].id; new_cat.fix_cost = user->_categories[row].fix_cost; new_cat.backcolor = old_cat.backcolor; new_cat.forecolor = old_cat.forecolor; new_cat.font = old_cat.font; new_cat.parent = old_cat.parent; try { new_id = user->GetCategoryId(new_cat.name); if (new_id != new_cat.id) { QMessageBox::critical(0, _("Error"), _("Category ")+new_cat.name+_(" already exists")); _categoriesGrid->setItem(row, CATEGORY_NAME, new QTableWidgetItem(_(user->_categories[row].name.toStdString().c_str()))); _inModification = false; return ; } } catch(User::CategoryNotFound e) {} _kiss->UpdateCategory(new_cat); } // New category else { if (op_complete) { _inModification = false; return ; } try { user->GetCategoryId(new_cat.name); QMessageBox::critical(0, _("Error"), _("Category ")+new_cat.name+_(" already exists")); _inModification = false; return ; } catch(User::CategoryNotFound e) {} new_cat.fix_cost = false; _kiss->AddCategory(new_cat); AddCategory(row, new_cat); SET_READ_ONLY(row, CATEGORY_BACKGROUND_COLOR); SET_READ_ONLY(row, CATEGORY_FOREGROUND_COLOR); SET_READ_ONLY(row, CATEGORY_FONT); SET_READ_ONLY(row, CATEGORY_DELETE); new_cat.id = 0; _categoriesGrid->setRowCount(row+2); AddCategory(++row, new_cat); } _wxUI->NeedReload(); _inModification = false; } void PreferencesPanel::OnChangeName() { User* user = _kiss->GetUser(); QString name = _name->text(); if (name == user->_name) return; if (!name.size()) { QMessageBox::critical(0, _("Error"), _("Invalid name !")); return; } if (_kiss->UserExists(name)) { QMessageBox::critical(0, _("Error"), _("User ") + name + _(" already exists")); return; } _kiss->ChangeName(name); QMessageBox::information(0, "KissCount", _("Name changed")); _wxUI->NeedReload(); OnShow(); } void PreferencesPanel::OnChangePassword() { PasswordDialog g(_kiss, _wxUI); g.setModal(true); g.exec(); } void PreferencesPanel::OnOperationOrderChange(int index) { if (index == 0) _kiss->SetOperationOrder("ASC"); else _kiss->SetOperationOrder("DESC"); _wxUI->NeedReload(); } void PreferencesPanel::OnLanguageChange(int index) { if (_inModification) return; int language = SupportedLanguages::languages[index].language; QString name_lang = SupportedLanguages::languages[index].name; if (_wxUI->SetLanguage(name_lang) || language == SupportedLanguages::English) { _wxUI->NeedReload(); _kiss->SetLanguage(name_lang); QMessageBox::information(0, "KissCount", _("Language successfully changed, please go to another panel")); } else QMessageBox::critical(0, _("Error"), _("Language not changed")); } void PreferencesPanel::OnShow() { _wxUI->setWindowTitle(_kiss->GetUser()->_name + " - " + _("Preferences")); InitLanguage(_kiss->GetUser()); } void PreferencesPanel::OnKillMe() { User* user = _kiss->GetUser(); if (QMessageBox::question(0, "KissCount", _("Are you sure want to delete ")+user->_name+_(" profil ?"), QMessageBox::Yes|QMessageBox::No) == QMessageBox::No) { return; } _kiss->KillMe(); }