diff options
author | Yorhel <git@yorhel.nl> | 2009-09-19 16:58:46 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-09-19 16:58:46 +0200 |
commit | f98086b625473f8d2dab5369aeed87f55193e503 (patch) | |
tree | 588fb5fe2defeb7a6b01f76fe2983e4c60dbe3b0 | |
parent | dea3c51ca55e30767d8321f2fa9581d036df0828 (diff) |
Added contra account management + several other improvements
The other improvements:
- Renamed some actions in geld.ui
- Fixed bug in Transaction::load()
- Properly set translations.contra=NULL when no contra account is selected
- Added default argument for ContraAccount::save()
-rw-r--r-- | contraaccount.cpp | 13 | ||||
-rw-r--r-- | contraaccount.h | 3 | ||||
-rw-r--r-- | geld.cpp | 144 | ||||
-rw-r--r-- | geld.h | 6 | ||||
-rw-r--r-- | geld.ui | 103 | ||||
-rw-r--r-- | transaction.cpp | 9 |
6 files changed, 243 insertions, 35 deletions
diff --git a/contraaccount.cpp b/contraaccount.cpp index 87606ed..86ce9b8 100644 --- a/contraaccount.cpp +++ b/contraaccount.cpp @@ -8,6 +8,7 @@ ContraAccount::ContraAccount(QWidget *parent) : m_ui(new Ui::ContraAccount) { m_ui->setupUi(this); + m_ui->Name->setFocus(); } ContraAccount::~ContraAccount() @@ -29,6 +30,18 @@ void ContraAccount::on_buttonBox_accepted() accept(); } +void ContraAccount::load(int id) +{ + QSqlQuery q; + q.prepare("SELECT name, account, address FROM contra_accounts WHERE id = ?"); + q.addBindValue(id); + q.exec(); + q.next(); + m_ui->Name->setText(q.value(0).toString()); + m_ui->Account->setText(q.value(1).toString()); + m_ui->Address->setPlainText(q.value(2).toString()); +} + int ContraAccount::save(int id) { QSqlQuery q; diff --git a/contraaccount.h b/contraaccount.h index 7784cc5..76d8513 100644 --- a/contraaccount.h +++ b/contraaccount.h @@ -12,7 +12,8 @@ class ContraAccount : public QDialog { public: ContraAccount(QWidget *parent = 0); ~ContraAccount(); - int save(int); + void load(int); + int save(int = 0); private: Ui::ContraAccount *m_ui; @@ -5,6 +5,7 @@ #include <QtGlobal> #include <QSqlQueryModel> #include <QMessageBox> +#include "contraaccount.h" #include "transactionmodel.h" #include "transaction.h" @@ -28,20 +29,35 @@ Geld::Geld(QWidget *parent) TransactionModel *transmod = new TransactionModel(ui->tableTransactions); ui->tableTransactions->setModel(transmod); ui->tableTransactions->setColumnHidden(0, true); - refreshTransactions(); + + QSqlQueryModel *contramod = new QSqlQueryModel(ui->tableContra); + ui->tableContra->setModel(contramod); + ui->tableTransactions->setColumnHidden(0, true); + refreshLists(); // the Qt Designer interface lacks functionality for connecting actions to widgets - ui->tableTransactions->addAction(ui->action_trans_Add); - ui->tableTransactions->addAction(ui->action_trans_Edit); - ui->tableTransactions->addAction(ui->action_trans_Delete); + ui->tableTransactions->addAction(ui->actionTransAdd); + ui->tableTransactions->addAction(ui->actionTransEdit); + ui->tableTransactions->addAction(ui->actionTransDelete); + + ui->tableContra->addAction(ui->actionContraAdd); + ui->tableContra->addAction(ui->actionContraEdit); + ui->tableContra->addAction(ui->actionContraDelete); // the Qt Designer interface also lacks some functionality when it comes to connecting signals to functions - connect(ui->btnAddTransaction, SIGNAL(clicked()), this, SLOT(addTransaction())); - connect(ui->action_trans_Add, SIGNAL(triggered()), this, SLOT(addTransaction())); - connect(ui->btnEditTransaction, SIGNAL(clicked()), this, SLOT(editTransaction())); - connect(ui->action_trans_Edit, SIGNAL(triggered()), this, SLOT(editTransaction())); - connect(ui->tableTransactions, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editTransaction())); - connect(ui->action_trans_Delete, SIGNAL(triggered()), this, SLOT(deleteTransaction())); + connect(ui->btnAddTransaction, SIGNAL(clicked()), this, SLOT(addTransaction())); + connect(ui->actionTransAdd, SIGNAL(triggered()), this, SLOT(addTransaction())); + connect(ui->btnEditTransaction, SIGNAL(clicked()), this, SLOT(editTransaction())); + connect(ui->actionTransEdit, SIGNAL(triggered()), this, SLOT(editTransaction())); + connect(ui->tableTransactions, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editTransaction())); + connect(ui->actionTransDelete, SIGNAL(triggered()), this, SLOT(deleteTransaction())); + + connect(ui->btnAddContra, SIGNAL(clicked()), this, SLOT(addContra())); + connect(ui->actionContraAdd, SIGNAL(triggered()), this, SLOT(addContra())); + connect(ui->btnEditContra, SIGNAL(clicked()), this, SLOT(editContra())); + connect(ui->actionContraEdit, SIGNAL(triggered()), this, SLOT(editContra())); + connect(ui->tableContra, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editContra())); + connect(ui->actionContraDelete, SIGNAL(triggered()), this, SLOT(deleteContra())); ui->statusBar->showMessage(QString("Opened database file %1").arg(f), 0); } @@ -92,18 +108,7 @@ void Geld::closeDB() QSqlDatabase::removeDatabase(conn); } -int Geld::selectedTransaction() { - // this. is. soooooooo. ugly. - TransactionModel *mod = (TransactionModel *) ui->tableTransactions->model(); - QModelIndexList indexes = ui->tableTransactions->selectionModel()->selection().indexes(); - if(indexes.count() != mod->columnCount()) { - ui->statusBar->showMessage("Nothing selected.", 3000); - return 0; - } - return mod->data(mod->index(indexes.at(0).row(), 0), Qt::DisplayRole).toInt(); -} - -void Geld::refreshTransactions() { +void Geld::refreshLists() { ui->tableTransactions->horizontalHeader()->setStretchLastSection(false); ((TransactionModel *) ui->tableTransactions->model())->refresh(); ui->tableTransactions->resizeColumnsToContents(); @@ -114,6 +119,36 @@ void Geld::refreshTransactions() { q.next(); ui->lblTransactionBalance->setText(QString("Balance: <span style=\"color: %1\">%2</span>") .arg(q.value(0).toInt() < 0 ? "red" : "green").arg(q.value(0).toDouble()/100, 4, 'f', 2)); + + ui->tableContra->horizontalHeader()->setStretchLastSection(false); + QSqlQueryModel *m = (QSqlQueryModel *)ui->tableContra->model(); + m->setQuery( + "SELECT c.id, c.account, c.name, COUNT(t.id), c.address " + "FROM contra_accounts c " + "LEFT JOIN transactions t ON t.contra = c.id " + "GROUP BY c.id " + "ORDER BY name" + ); + m->setHeaderData(0, Qt::Horizontal, "ID"); + m->setHeaderData(1, Qt::Horizontal, "Account"); + m->setHeaderData(2, Qt::Horizontal, "Name"); + m->setHeaderData(3, Qt::Horizontal, "Transactions"); + m->setHeaderData(4, Qt::Horizontal, "Address"); + ui->tableContra->setColumnHidden(0, true); + ui->tableContra->resizeColumnsToContents(); + ui->tableContra->horizontalHeader()->setStretchLastSection(true); +} + +int Geld::selectedTransaction() +{ + // this. is. soooooooo. ugly. + TransactionModel *mod = (TransactionModel *) ui->tableTransactions->model(); + QModelIndexList indexes = ui->tableTransactions->selectionModel()->selection().indexes(); + if(indexes.count() != mod->columnCount()) { + ui->statusBar->showMessage("Nothing selected.", 3000); + return 0; + } + return mod->data(mod->index(indexes.at(0).row(), 0), Qt::DisplayRole).toInt(); } void Geld::editTransaction() @@ -125,7 +160,7 @@ void Geld::editTransaction() t.load(id); if(t.exec() == QDialog::Accepted) { t.save(id); - refreshTransactions(); + refreshLists(); } } @@ -134,7 +169,7 @@ void Geld::addTransaction() Transaction t(this); if(t.exec() == QDialog::Accepted) { t.save(); - refreshTransactions(); + refreshLists(); } } @@ -148,7 +183,66 @@ void Geld::deleteTransaction() q.prepare("DELETE FROM transactions WHERE id = ?"); q.addBindValue(id); q.exec(); - refreshTransactions(); + refreshLists(); + } +} + +int Geld::selectedContra() +{ + // this. is. soooooooo. ugly. + QAbstractItemModel *mod = ui->tableContra->model(); + QModelIndexList indexes = ui->tableContra->selectionModel()->selection().indexes(); + if(indexes.count() != mod->columnCount()) { + ui->statusBar->showMessage("Nothing selected.", 3000); + return 0; + } + return mod->data(mod->index(indexes.at(0).row(), 0), Qt::DisplayRole).toInt(); +} + +void Geld::addContra() +{ + ContraAccount c(this); + if(c.exec() == QDialog::Accepted) { + c.save(); + refreshLists(); + } +} + +void Geld::editContra() +{ + int id = selectedContra(); + if(!id) + return; + ContraAccount c(this); + c.load(id); + if(c.exec() == QDialog::Accepted) { + c.save(id); + refreshLists(); + } +} + +void Geld::deleteContra() +{ + int id = selectedContra(); + if(!id) + return; + QSqlQuery q; + q.prepare("SELECT 1 FROM transactions WHERE contra = ? LIMIT 1"); + q.addBindValue(id); + q.exec(); + if(q.next()) { + QMessageBox::critical(this, "Can't delete contra account", + "This contra account appears to be refered to from a transaction. " + "Please make sure there are no transactions with this contra account in the database and try again." + ); + return; + } + if(QMessageBox::question(this, "You sure?", "Are you sure you want to remove the selected contra account?", QMessageBox::No|QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { + QSqlQuery q; + q.prepare("DELETE FROM contra_accounts WHERE id = ?"); + q.addBindValue(id); + q.exec(); + refreshLists(); } } @@ -21,13 +21,17 @@ private: void initDB(QString f); void closeDB(); int selectedTransaction(); - void refreshTransactions(); + int selectedContra(); + void refreshLists(); Ui::Geld *ui; private slots: void addTransaction(); void editTransaction(); void deleteTransaction(); + void addContra(); + void editContra(); + void deleteContra(); }; #endif // GELD_H @@ -20,6 +20,9 @@ <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QTabWidget" name="tabWidget"> + <property name="tabPosition"> + <enum>QTabWidget::North</enum> + </property> <property name="currentIndex"> <number>0</number> </property> @@ -63,7 +66,7 @@ <item row="1" column="2"> <widget class="QPushButton" name="btnAddTransaction"> <property name="text"> - <string>&Add new transaction</string> + <string>&New transaction</string> </property> </widget> </item> @@ -82,6 +85,74 @@ </item> </layout> </widget> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Contra accounts</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="2"> + <widget class="QPushButton" name="btnAddContra"> + <property name="text"> + <string>&New contra account</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="3"> + <widget class="QTableView" name="tableContra"> + <property name="contextMenuPolicy"> + <enum>Qt::ActionsContextMenu</enum> + </property> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + <attribute name="horizontalHeaderHighlightSections"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderDefaultSectionSize"> + <number>18</number> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderDefaultSectionSize"> + <number>18</number> + </attribute> + <attribute name="horizontalHeaderHighlightSections"> + <bool>false</bool> + </attribute> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="btnEditContra"> + <property name="text"> + <string>&Edit</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> </widget> </item> </layout> @@ -115,7 +186,7 @@ <string>Ctrl+Q</string> </property> </action> - <action name="action_trans_Delete"> + <action name="actionTransDelete"> <property name="text"> <string>&Delete</string> </property> @@ -123,7 +194,7 @@ <string>Remove transaction</string> </property> </action> - <action name="action_trans_Add"> + <action name="actionTransAdd"> <property name="text"> <string>&New transaction</string> </property> @@ -131,7 +202,7 @@ <string>Add new transaction</string> </property> </action> - <action name="action_trans_Edit"> + <action name="actionTransEdit"> <property name="text"> <string>&Edit</string> </property> @@ -139,6 +210,30 @@ <string>Edit transaction</string> </property> </action> + <action name="actionContraAdd"> + <property name="text"> + <string>&New contra account</string> + </property> + <property name="toolTip"> + <string>Add new contra account</string> + </property> + </action> + <action name="actionContraEdit"> + <property name="text"> + <string>&Edit</string> + </property> + <property name="toolTip"> + <string>Edit contra account</string> + </property> + </action> + <action name="actionContraDelete"> + <property name="text"> + <string>&Delete</string> + </property> + <property name="toolTip"> + <string>Remove contra account</string> + </property> + </action> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> diff --git a/transaction.cpp b/transaction.cpp index 071f24d..36ca247 100644 --- a/transaction.cpp +++ b/transaction.cpp @@ -61,8 +61,8 @@ void Transaction::load(int id) q.next(); m_ui->Date->setText(q.value(0).toString()); m_ui->Amount->setText(QString("%1").arg(q.value(1).toDouble()/100, 4, 'f', 2)); - m_ui->Contra->setCurrentIndex(m_ui->Contra->findData(q.value(3))); - m_ui->Description->setPlainText(q.value(4).toString()); + m_ui->Contra->setCurrentIndex(q.value(2).isNull() ? 0 : m_ui->Contra->findData(q.value(2))); + m_ui->Description->setPlainText(q.value(3).toString()); } void Transaction::save(int id) @@ -74,7 +74,8 @@ void Transaction::save(int id) ); q.addBindValue(m_ui->Date->text()); q.addBindValue(m_ui->Amount->text().toDouble()*100); - q.addBindValue(m_ui->Contra->itemData(m_ui->Contra->currentIndex()).toInt()); + int contra = m_ui->Contra->itemData(m_ui->Contra->currentIndex()).toInt(); + q.addBindValue(contra ? contra : QVariant(QVariant::Int)); q.addBindValue(m_ui->Description->toPlainText()); if(id) q.addBindValue(id); @@ -88,7 +89,7 @@ void Transaction::on_Contra_currentIndexChanged(int index) ContraAccount c(this); if(c.exec() == QDialog::Accepted) { - int id = c.save(0); + int id = c.save(); populateContra(); m_ui->Contra->setCurrentIndex(m_ui->Contra->findData(id)); } else { |