-rwxr-xr-x | noncore/apps/qashmoney/CHANGES | 8 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/README | 35 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/account.cpp | 9 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/accountdisplay.cpp | 19 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/accountdisplay.h | 1 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/budget.cpp | 3 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/budgetdisplay.cpp | 12 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/budgetdisplay.h | 1 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/install/CONTROL/opie-qashmoney.control | 5 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/preferences.cpp | 50 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/preferences.h | 3 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/qashmoney.cpp | 23 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transaction.cpp | 122 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transaction.h | 3 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transactiondisplay.cpp | 20 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transactiondisplay.h | 1 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transfer.cpp | 61 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transfer.h | 3 | ||||
-rwxr-xr-x | noncore/apps/qashmoney/transferdialog.cpp | 2 |
19 files changed, 276 insertions, 105 deletions
diff --git a/noncore/apps/qashmoney/CHANGES b/noncore/apps/qashmoney/CHANGES index f17035b..a3ac224 100755 --- a/noncore/apps/qashmoney/CHANGES +++ b/noncore/apps/qashmoney/CHANGES @@ -1,20 +1,28 @@ QashMoney - Budget Software for the Sharp Zaurus CHANGES +0.76 - 5/21/03 + + Updated postinst file so app will install on new Sharp ROM 3.1 + Improved algorithm for selecting cleared transaction + Fixed budget display bug + +---------------------------------------------------------------------------------- + 11/1/02 - Initial release of 0.2 version. Considered stable beta version. 11/16/02 - Release of version 0.3. This is a stable version adding function to transfer money between accounts. Several bugs fixes and speed enhancements have been done. 11/21/02 - 0.31 news tabs working but not yet displaying accounts 12/15/02 - QashMoney gets a complete face lift and now has a date picker. 12/29/02 - Version 0.41 released. This release fixes more bugs and adds a function to manage transaction memory items. 12/31/02 - Version 0.42 released. Maintenance release fixing soem rather nasty bugs that screw up account, transaction, and transfer displays. 03/03/03 - Version 0.60 released. QashMoney has undergone quite a transformation. A new GUI that incorporates all of Qts excellent layout capabilities should display nicely in all formats. A new embedded SQL database should make QashMoney very extensible. 4/25/03 - Version 0.70 released. This version includes many new features over 0.60 including currency support for accounts, a function to limit transaction views, and an all new budgeting diff --git a/noncore/apps/qashmoney/README b/noncore/apps/qashmoney/README index 1888ce6..ef004f7 100755 --- a/noncore/apps/qashmoney/README +++ b/noncore/apps/qashmoney/README @@ -1,94 +1,71 @@ QashMoney - Budget Software for the Sharp Zaurus README -Welcome to the latest version of QashMoney! This app is designed to make your -budgeting fast, inuitive and easy. - This file lists all the important files in the qashmoney CVS directory and how to make the IPK file that goes on the Zaurus. When you checkout the -qashmoney module from CVS, it will create a directory on your hard drive called -qashmoney. These instructions assume you are in the directory. +qashmoney-source module from CVS, it will create a directory on your hard drive called +qashmoney-source. These instructions assume you are in this directory. The first thing you need to do is have all the necessary cross-compile software and Qtopia installed on your system. I assume you have already done this since you are downloading CVS, but if not, go to: http://docs.zaurus.com and download the RPMS that you need for development. You also must have sqlite installed on your system to successfully compile QashMoney. Go to: http://www.sqlite.org -to download this progam. The SQLite library has already been compiled for the -IPK and is in the 'install' directory. So there is no need to compile SQLite -for ARM but you can if you want. There are instructions for that on the -website. +to download this progam. After that, set the correct environment variables for the package you -are developing.Two scripts in the qashmoney are used for that purpose: x86.sh -andarm.shIf you are buidling for x86 type: +are developing. Two scripts in the qashmoney-source directory are used for that purpose: x86.sh +and arm.sh. If you are building for x86 type: source x86.sh and press enter. To make binaries that run on the Zaurus, type: source arm.sh Next, construct the makefile by typing: tmake -o Makefile qashmoney.pro tmake is Trolltech's program for constructing a typical GNU Makefile from the project file (qashmoney.pro for this application). If you get an "error: tmake command not found", you either don't have all the correct RPMS installed or your environment variables are not correctly set. If all is well type: make and the program should be constructed and you will be left with a qashmoney binary in this directory. If you compiled for x86, you can see the application by using the Qt Virtual Frame Buffer which emulates the Qtopia environment on your computer. First, copy all the files from the databasefiles directory within the qashmoney directory. Otherwise, the program will not function. To run QashMoney in the Qtopia Virtual Frame Buffer, type: qvfb & ./qashmoney -qws and QashMoney should appear in the frambuffer. You can use and test qashmoney here as you would on the Zaurus. -If you compile the binary file for the Zaurus, another script in this directory -will come in handy. To automagically make the IPK file, type: - -su -./make_ipk - -You need to be the root user to set the ownership of the binary and other -files correctly. The IPK file will appear in the qashmoney directory. Now put -this file onto the Zaurus and install! - -Two other scripts in the directory may be of use. The make_x86 script cleans -the directory and makes the x86 qashmoney binary automatically. The make_arm -scripts makes the ARM binary. So you should really only have to type three -commands the make the IPK file: - -./make_arm -su -./make_ipk +If you want to compile the app and make the IPK file, check out the qashmoney-build module and see the README file in that module. I hope the program can be useful. If you have any questions or comments, please contact me at qashmoneyman@attbi.com Thanks! Allen Disclaimer: Altough I've tried to make this application tight and well functioning, it comes with absolutely no warranty and I will not be liable for any damage it may cause. diff --git a/noncore/apps/qashmoney/account.cpp b/noncore/apps/qashmoney/account.cpp index fc2f8c1..28f9ba2 100755 --- a/noncore/apps/qashmoney/account.cpp +++ b/noncore/apps/qashmoney/account.cpp @@ -9,35 +9,34 @@ extern Preferences *preferences; Account::Account () { adb = sqlite_open ( "qmaccounts.db", 0, NULL ); } Account::~Account () { sqlite_close ( adb ); } void Account::addAccount ( QString name, int parentid, float balance, int type, QString description, float creditlimit, int statementyear, int statementmonth, int statementday, float statementbalance, const char *currency ) { - int r = sqlite_exec_printf ( adb, "insert into accounts2 values ( '%q', %i, %.2f, %i, '%q', %.2f, %i, %i, %i, %.2f, '%q', 0, 0, 0, 0, 0, NULL );", 0, 0, 0, + sqlite_exec_printf ( adb, "insert into accounts2 values ( '%q', %i, %.2f, %i, '%q', %.2f, %i, %i, %i, %.2f, '%q', 0, 0, 0, 0, 0, NULL );", 0, 0, 0, (const char *) name, parentid, balance, type, (const char *) description, creditlimit, statementyear, statementmonth, statementday, statementbalance, currency ); - cout << "Results = " << r << endl; } void Account::updateAccount ( QString name, QString description, QString currencycode, int accountid ) { sqlite_exec_printf ( adb, "update accounts2 set name = '%q', description = '%q', currency = '%q' where accountid = %i;", 0, 0, 0, ( const char * ) name, ( const char * ) description, ( const char * ) currencycode, accountid ); } void Account::deleteAccount ( int accountid ) { sqlite_exec_printf ( adb, "delete from accounts2 where accountid = %i;", 0, 0, 0, accountid ); } void Account::setAccountExpanded ( int expanded, int accountid ) { sqlite_exec_printf ( adb, "update accounts2 set r1 = %i where accountid = %i;", 0, 0, 0, expanded, accountid ); } @@ -212,32 +211,38 @@ void Account::displayAccounts ( QListView *listview ) listview->setColumnWidth ( 0, preferences->getColumnPreference ( 1 ) ); listview->setColumnWidthMode ( 0, QListView::Manual ); listview->setColumnWidth ( 1, preferences->getColumnPreference ( 2 ) ); listview->setColumnWidthMode ( 1, QListView::Manual ); listview->setColumnWidthMode ( 2, QListView::Manual ); } else { listview->setColumnWidth ( 0, preferences->getColumnPreference ( 10 ) ); listview->setColumnWidthMode ( 0, QListView::Manual ); listview->setColumnWidth ( 1, preferences->getColumnPreference ( 11 ) ); listview->setColumnWidthMode ( 1, QListView::Manual ); listview->setColumnWidth ( 2, preferences->getColumnPreference ( 12 ) ); listview->setColumnWidthMode ( 2, QListView::Manual ); listview->setColumnWidthMode ( 3, QListView::Manual ); } + + // Now reset the column sorting to user preference + int column = 0; + int direction = 0; + preferences->getSortingPreference ( 1, &column, &direction ); + listview->setSorting ( column, direction ); } int Account::displayParentAccountNames ( QComboBox *combobox, QString indexstring ) { char **results; int rows, columns, index; index = 0; sqlite_get_table ( adb, "select name from accounts2 order by name asc;", &results, &rows, &columns, NULL ); int counter = 1; int indexcounter = 1; int total = ( rows + 1 ) * columns; while ( counter < total ) { if ( getParentAccountID ( results [ counter ] ) == -1 ) { combobox->insertItem ( results [ counter ], -1 ); diff --git a/noncore/apps/qashmoney/accountdisplay.cpp b/noncore/apps/qashmoney/accountdisplay.cpp index b2c0838..64f4ea8 100755 --- a/noncore/apps/qashmoney/accountdisplay.cpp +++ b/noncore/apps/qashmoney/accountdisplay.cpp @@ -1,19 +1,20 @@ #include <qdatetime.h> #include <qmessagebox.h> #include <qheader.h> +#include <iostream.h> #include "accountdisplay.h" #include "newaccount.h" #include "transaction.h" #include "transferdialog.h" #include "preferences.h" #include "transfer.h" extern Account *account; extern Transaction *transaction; extern Transfer *transfer; extern Preferences *preferences; AccountDisplay::AccountDisplay ( QWidget *parent ) : QWidget ( parent ) { cleared = 0; @@ -32,36 +33,37 @@ AccountDisplay::AccountDisplay ( QWidget *parent ) : QWidget ( parent ) deleteaccount = new QPushButton ( firstline ); deleteaccount->setPixmap( QPixmap ( "/opt/QtPalmtop/pics/delete.png") ); connect ( deleteaccount, SIGNAL ( released () ), this, SLOT ( deleteAccount () ) ); transferbutton = new QPushButton ( firstline ); transferbutton->setPixmap( QPixmap ( "/opt/QtPalmtop/pics/transfer.png") ); transferbutton->setToggleButton ( TRUE ); connect ( transferbutton, SIGNAL ( toggled ( bool ) ), this, SLOT ( accountTransfer ( bool ) ) ); listview = new QListView ( this ); listview->setAllColumnsShowFocus ( TRUE ); listview->setShowSortIndicator ( TRUE ); listview->setRootIsDecorated ( TRUE ); listview->setMultiSelection ( FALSE ); connect ( listview, SIGNAL ( expanded ( QListViewItem * ) ), this, SLOT ( setAccountExpanded ( QListViewItem * ) ) ); connect ( listview, SIGNAL ( collapsed ( QListViewItem * ) ), this, SLOT ( setAccountCollapsed ( QListViewItem * ) ) ); - + listview->header()->setTracking ( FALSE ); connect ( listview->header(), SIGNAL ( sizeChange ( int, int, int ) ), this, SLOT ( saveColumnSize ( int, int, int ) ) ); - + connect ( listview->header(), SIGNAL ( clicked ( int ) ), this, SLOT ( saveSortingPreference ( int ) ) ); + layout = new QVBoxLayout ( this, 2, 5 ); layout->addWidget ( firstline ); layout->addWidget ( listview ); } void AccountDisplay::setTabs ( QWidget *newtab2, QTabWidget *newtabs ) { tab2 = newtab2; maintabs = newtabs; } void AccountDisplay::addAccount () { // initialize local variables int parentid = 0; type = 0; @@ -255,40 +257,38 @@ void AccountDisplay::getTransferAccounts ( QListViewItem * item ) { // construct the transferdialog window TransferDialog *td = new TransferDialog ( this, firstaccountid, secondaccountid ); // enter today's date in the date box as default QDate today = QDate::currentDate (); int defaultday = today.day(); int defaultmonth = today.month(); int defaultyear = today.year(); td->date->setText ( preferences->getDate ( defaultyear, defaultmonth, defaultday ) ); if ( td->exec() == QDialog::Accepted ) { // set the cleared integer if the checkbox is checked if ( td->clearedcheckbox->isChecked() == TRUE ) cleared = 1; - + cout << "Year from transferdialog = " << td->getYear() << endl; // add the transfer with a new date if its been edited or use the default date if ( td->getDateEdited () == TRUE ) - transfer->addTransfer ( firstaccountid, account->getParentAccountID ( firstaccountid ), secondaccountid, - account->getParentAccountID ( secondaccountid ), td->getDay(), td->getMonth(), td->getYear(), td->amount->text().toFloat(), cleared ); + transfer->addTransfer ( firstaccountid, account->getParentAccountID ( firstaccountid ), secondaccountid, account->getParentAccountID ( secondaccountid ), td->getDay(), td->getMonth(), td->getYear(), td->amount->text().toFloat(), cleared ); else - transfer->addTransfer ( firstaccountid, account->getParentAccountID ( firstaccountid ), secondaccountid, - account->getParentAccountID ( secondaccountid ), defaultday, defaultmonth, defaultyear, td->amount->text().toFloat(), cleared ); + transfer->addTransfer ( firstaccountid, account->getParentAccountID ( firstaccountid ), secondaccountid, account->getParentAccountID ( secondaccountid ), defaultday, defaultmonth, defaultyear, td->amount->text().toFloat(), cleared ); // update account balances of both accounts and parents if necessary account->updateAccountBalance ( firstaccountid ); if ( account->getParentAccountID ( firstaccountid ) != -1 ) account->changeParentAccountBalance ( account->getParentAccountID ( firstaccountid ) ); account->updateAccountBalance ( secondaccountid ); if ( account->getParentAccountID ( secondaccountid ) != -1 ) account->changeParentAccountBalance ( account->getParentAccountID ( secondaccountid ) ); // redisplay accounts account->displayAccounts ( listview ); } else { firstaccountid = -1; secondaccountid = -1; @@ -334,32 +334,37 @@ void AccountDisplay::saveColumnSize ( int column, int oldsize, int newsize ) else preferences->changeColumnPreference ( 10, newsize ); break; case 1: if ( listview->columns() == 3 ) preferences->changeColumnPreference ( 2, newsize ); else preferences->changeColumnPreference ( 11, newsize ); break; case 2: preferences->changeColumnPreference ( 12, newsize ); break; } } +void AccountDisplay::saveSortingPreference ( int column ) + { + preferences->changeSortingPreference ( 1, column ); + } + int AccountDisplay::getIDColumn () { int counter; int columns = listview->columns(); for ( counter = 0; counter <= columns; counter++ ) if ( listview->header()->label ( counter ).length() == 0 ) return counter; } void AccountDisplay::editAccount () { if ( listview->selectedItem() == 0 ) QMessageBox::warning ( this, "QashMoney", "Please select an account\nto edit."); else { // set the accountid diff --git a/noncore/apps/qashmoney/accountdisplay.h b/noncore/apps/qashmoney/accountdisplay.h index 37bcb34..6d67b9b 100755 --- a/noncore/apps/qashmoney/accountdisplay.h +++ b/noncore/apps/qashmoney/accountdisplay.h @@ -29,25 +29,26 @@ class AccountDisplay : public QWidget int getIDColumn (); void setToggleButton (); public slots: void addAccount (); void editAccount (); void deleteAccount (); void accountTransfer ( bool state ); void getTransferAccounts ( QListViewItem * item ); void disableParentsWithChildren (); void enableAccounts (); private slots: void saveColumnSize ( int column, int oldsize, int newsize ); void setAccountExpanded ( QListViewItem *item ); void setAccountCollapsed ( QListViewItem *item ); + void saveSortingPreference ( int column ); private: int type, firstaccountid, secondaccountid, cleared; QWidget *tab2; QTabWidget *maintabs; }; #endif // ACCOUNTDISPLAY_H diff --git a/noncore/apps/qashmoney/budget.cpp b/noncore/apps/qashmoney/budget.cpp index 42f7eca..9f74078 100755 --- a/noncore/apps/qashmoney/budget.cpp +++ b/noncore/apps/qashmoney/budget.cpp @@ -1,19 +1,20 @@ #include "budget.h" #include "transaction.h" #include <stdlib.h> +#include <iostream.h> extern Transaction *transaction; Budget::Budget () { bdb = sqlite_open ( "qmbudgets.db", 0, NULL ); } Budget::~Budget () { sqlite_close ( bdb ); } int Budget::addBudget ( QString name, int type, QString description, QString currency, int startday, int startmonth, int startyear, int endday, int endmonth, int endyear, int defaultview ) { sqlite_exec_printf ( bdb, "insert into budgets values ( '%q', %i, '%q', '%q', %i, %i, %i, %i, %i, %i, %i, NULL );", 0, 0, 0, ( const char * ) name, type, ( const char * ) description, ( const char * ) currency, startday, startmonth, startyear, endday, endmonth, endyear, defaultview ); @@ -49,33 +50,33 @@ int Budget::getNumberOfBudgets () } int Budget::getNumberOfLineItems ( int budgetid ) { QString tablename = "table"; tablename.append ( QString::number ( budgetid ) ); char **results; sqlite_get_table_printf ( bdb, "select count() from '%q';", &results, NULL, NULL, NULL, ( const char * ) tablename ); return atoi ( results [ 1 ] ); } QStringList* Budget::getBudgetNames () { QStringList *names = new QStringList (); char **results; int rows, counter; - sqlite_get_table ( bdb, "select name from budgets order by name asc;", &results, &rows, NULL, NULL ); + sqlite_get_table ( bdb, "select name from budgets;", &results, &rows, NULL, NULL ); names->append ( "None" ); for ( counter = 0; counter < rows; counter++ ) names->append ( results [ counter+1 ] ); return names; } QString Budget::getBudgetName ( int budgetid ) { char **results; sqlite_get_table_printf ( bdb, "select name from budgets where budgetid= %i;", &results, NULL, NULL, NULL, budgetid ); return ( QString ) results [ 1 ]; } QString Budget::getBudgetDescription ( int budgetid ) { char **results; diff --git a/noncore/apps/qashmoney/budgetdisplay.cpp b/noncore/apps/qashmoney/budgetdisplay.cpp index 09f62b2..afc6a2d 100755 --- a/noncore/apps/qashmoney/budgetdisplay.cpp +++ b/noncore/apps/qashmoney/budgetdisplay.cpp @@ -69,32 +69,39 @@ BudgetDisplay::BudgetDisplay ( QWidget *parent ) : QWidget ( parent ) listview->setShowSortIndicator ( TRUE ); listview->setRootIsDecorated ( TRUE ); listview->setMultiSelection ( FALSE ); listview->addColumn ( "Line Item", preferences->getColumnPreference ( 13 ) ); // column id 13 listview->addColumn ( "Budget", preferences->getColumnPreference ( 14 ) ); // column id 14 listview->addColumn ( "Actual", preferences->getColumnPreference ( 15 ) ); // column id 15 listview->addColumn ( "", 0 ); // line item ids listview->setColumnWidthMode ( 0, QListView::Manual ); listview->setColumnWidthMode ( 1, QListView::Manual ); listview->setColumnWidthMode ( 2, QListView::Manual ); listview->setColumnAlignment ( 1, Qt::AlignRight ); listview->setColumnAlignment ( 2, Qt::AlignRight ); listview->setColumnWidthMode ( 3, QListView::Manual ); listview->header()->setTracking ( FALSE ); connect ( listview->header(), SIGNAL ( sizeChange ( int, int, int ) ), this, SLOT ( saveColumnSize ( int, int, int ) ) ); + connect ( listview->header(), SIGNAL ( clicked ( int ) ), this, SLOT ( saveSortingPreference ( int ) ) ); + + // pull the column sorting preference from the preferences table, and configure the listview accordingly + int column = 0; + int direction = 0; + preferences->getSortingPreference ( 3, &column, &direction ); + listview->setSorting ( column, direction ); displayBudgetNames(); layout = new QVBoxLayout ( this, 2, 2 ); layout->setMenuBar ( menu ); layout->addWidget ( firstline ); layout->addWidget ( secondline ); layout->addWidget ( listview ); } void BudgetDisplay::deleteBudget () { listview->clear(); transaction->clearBudgetIDs ( currentbudget ); budget->deleteBudget ( currentbudget ); if ( budgetbox->count() != 0 ) @@ -105,32 +112,37 @@ void BudgetDisplay::deleteBudget () void BudgetDisplay::saveColumnSize ( int column, int oldsize, int newsize ) { switch ( column ) { case 0: preferences->changeColumnPreference ( 13, newsize ); break; case 1: preferences->changeColumnPreference ( 14, newsize ); break; case 2: preferences->changeColumnPreference ( 15, newsize ); break; } } +void BudgetDisplay::saveSortingPreference ( int column ) + { + preferences->changeSortingPreference ( 3, column ); + } + int BudgetDisplay::getIDColumn () { int counter; int columns = listview->columns(); for ( counter = 0; counter <= columns; counter++ ) if ( listview->header()->label ( counter ).length() == 0 ) return counter; } void BudgetDisplay::newBudget () { constructBudgetWindow(); int response = nb->exec(); if ( response == 1 ) { // open a new budget object diff --git a/noncore/apps/qashmoney/budgetdisplay.h b/noncore/apps/qashmoney/budgetdisplay.h index 25e952a..3976ce1 100755 --- a/noncore/apps/qashmoney/budgetdisplay.h +++ b/noncore/apps/qashmoney/budgetdisplay.h @@ -56,30 +56,31 @@ class BudgetDisplay : public QWidget void updateBudgetInformation (); private slots: void saveColumnSize ( int column, int oldsize, int newsize ); void newBudget (); void deleteBudget (); void setCurrentBudget ( int ); void setCurrentView ( int ); void showCalendar (); void newLineItem (); void deleteLineItem (); void checkBudgets (); void editBudget (); void editLineItem (); void constructBudgetWindow (); void constructLineItemWindow (); + void saveSortingPreference ( int column ); private: QStringList *names; QStringList *ids; int currentbudget, year, month, day; QDate newDate; QString totalbudget, totalactual; QString datelabel; QDialog *nb; QDialog *newlineitem; }; #endif // BUDGETDISPLAY_H diff --git a/noncore/apps/qashmoney/install/CONTROL/opie-qashmoney.control b/noncore/apps/qashmoney/install/CONTROL/opie-qashmoney.control index b00e3b1..ec65c0e 100755 --- a/noncore/apps/qashmoney/install/CONTROL/opie-qashmoney.control +++ b/noncore/apps/qashmoney/install/CONTROL/opie-qashmoney.control @@ -1,7 +1,8 @@ Package: qashmoney +Files: bin/qashmoney pics/qashmony/* pics/qashmony/flags/* apps/Applications/qashmoney.desktop Priority: optional -Version: 0.75 +Version: 0.76 Architecture: arm -Maintainer: Allen Forsythe qashmoneyman@attbi.com +Maintainer: Allen Forsythe allen@qashmoney.org Section: Applications Description: QashMoney provides an intuitive and fast way to keep track of your accounts and budgets. diff --git a/noncore/apps/qashmoney/preferences.cpp b/noncore/apps/qashmoney/preferences.cpp index 9bf64dd..880807a 100755 --- a/noncore/apps/qashmoney/preferences.cpp +++ b/noncore/apps/qashmoney/preferences.cpp @@ -137,44 +137,94 @@ void Preferences::initializeColumnPreferences () // initialize budget line item column sqlite_get_table ( db, "select width from columns where id = 13;", &results, &rows, &columns, 0 ); if ( rows == 0 ) sqlite_exec ( db, "insert into columns values ( 'budgetlineitem', 50, 0, 0, 0, NULL );", 0, 0, 0 ); // initialize budget budget column sqlite_get_table ( db, "select width from columns where id = 14;", &results, &rows, &columns, 0 ); if ( rows == 0 ) sqlite_exec ( db, "insert into columns values ( 'budgetbudget', 50, 0, 0, 0, NULL );", 0, 0, 0 ); // initialize budget actual column sqlite_get_table ( db, "select width from columns where id = 15;", &results, &rows, &columns, 0 ); if ( rows == 0 ) sqlite_exec ( db, "insert into columns values ( 'budgetactual', 50, 0, 0, 0, NULL );", 0, 0, 0 ); } +void Preferences::initializeSortingPreferences () + { + int rows = 0; + int columns = 0; + char **results; + + if ( sqlite_get_table ( db, "select count() from sorting;", 0, 0, 0, 0 ) != 0 ) + sqlite_exec ( db, "create table sorting ( listbox, column, direction, id integer primary key );", 0, 0, 0 ); + + // initialize account listbox sorting. Set direction = 1 here so ascending sort is default. + sqlite_get_table ( db, "select column, direction from sorting where id = 1;", &results, &rows, &columns, 0 ); + if ( rows == 0 ) + sqlite_exec ( db, "insert into sorting values ( 'accounts', 0, 1, NULL );", 0, 0, 0 ); + + // initialize transaction listbox sorting + sqlite_get_table ( db, "select column, direction from sorting where id = 2;", &results, &rows, &columns, 0); + if ( rows == 0 ) + sqlite_exec ( db, "insert into sorting values ( 'transactions', 0, 1, NULL );", 0, 0, 0 ); + + // initialize budgets listbox sorting + sqlite_get_table ( db, "select column, direction from sorting where id = 3;", & results, &rows, &columns, 0 ); + if ( rows == 0 ) + sqlite_exec ( db, "insert into sorting values ( 'budgets', 0, 1, NULL );", 0, 0, 0 ); + } + void Preferences::changeColumnPreference ( int id, int width ) { sqlite_exec_printf ( db, "update columns set width = %i where id = %i;", 0, 0, 0, width, id ); } int Preferences::getColumnPreference ( int id ) { char **results; sqlite_get_table_printf ( db, "select width from columns where id = %i;", &results, NULL, NULL, NULL, id ); return atoi ( results [ 1 ] ); } +void Preferences::changeSortingPreference ( int id, int column ) + { + int pColumn = 0; // column setting coming from the prefs object + int pDirection = 0; // direction setting coming from the prefs object + + // because there appears to be no way to query the QT header object directly for it's current sort settings, we have + // to maintain track of them ourselves. So start by pulling the current saved setting for this view. + getSortingPreference ( id, &pColumn, &pDirection ); + + // if the current saved column == the new column, then the user wants to toggle the sort order. + // otherwise we behave like QT does by default, which is to select the new column and default to an ascending sort. + if ( column == pColumn ) + sqlite_exec_printf ( db, "update sorting set direction = %i where id = %i;", 0, 0, 0, !pDirection, id ); + else + sqlite_exec_printf ( db, "update sorting set column = %i, direction = 1 where id = %i;", 0, 0, 0, column, id ); + } + +void Preferences::getSortingPreference ( int id, int *column, int *direction ) + { + char **results; + sqlite_get_table_printf ( db, "select column, direction from sorting where id = %i;", &results, NULL, NULL, NULL, id ); + *column = atoi ( results [ 2 ] ); + *direction = atoi ( results [ 3 ] ); + } + int Preferences::getPreference ( int id ) { char **results; sqlite_get_table_printf ( db, "select preference from preferences where id = %i;", &results, NULL, NULL, NULL, id ); return atoi ( results [ 1 ] ); } QString Preferences::getSeparator ( ) { int s = getPreference ( 2 ); if ( s == 1 ) return "/"; if ( s ==2 ) return "-"; else return "."; diff --git a/noncore/apps/qashmoney/preferences.h b/noncore/apps/qashmoney/preferences.h index 4a3e058..10ec6e9 100755 --- a/noncore/apps/qashmoney/preferences.h +++ b/noncore/apps/qashmoney/preferences.h @@ -1,42 +1,45 @@ #include <sqlite.h> #include <qstring.h> #ifndef PREFERENCES_H #define PREFERENCES_H class Preferences { public: Preferences (); ~Preferences (); void addPreferences (); void initializeColumnPreferences (); + void initializeSortingPreferences (); // Returns a preference value for the given preferences ID int getPreference ( int ); int getColumnPreference ( int id ); + void getSortingPreference ( int id, int *column, int *direction ); // Convenience for getting date separator with one function // call. Takes the preference id as its argument QString getSeparator ( ); // Changes a preference for the given ID void changePreference ( int , int ); void changeColumnPreference ( int id, int width ); + void changeSortingPreference ( int id, int column ); // The primary database that stores all our data sqlite *db; // This function returns a Qstring for the year first date formats // for displaying. It takes the date numbers QString getDate ( int, int, int ); QString getDate ( int y, int m ); void setDefaultDatePreferences (); }; #endif diff --git a/noncore/apps/qashmoney/qashmoney.cpp b/noncore/apps/qashmoney/qashmoney.cpp index 83eea01..20e8d32 100755 --- a/noncore/apps/qashmoney/qashmoney.cpp +++ b/noncore/apps/qashmoney/qashmoney.cpp @@ -1,34 +1,35 @@ #include "qashmoney.h" #include "preferencedialogs.h" #include "memorydialog.h" #include <qheader.h> #include <iostream.h> Budget *budget = new Budget (); Preferences *preferences = new Preferences (); Account *account = new Account (); Transaction *transaction = new Transaction (); Transfer *transfer = new Transfer (); Memory *memory = new Memory (); QashMoney::QashMoney () : QWidget () { - preferences->addPreferences(); + preferences->addPreferences (); preferences->initializeColumnPreferences (); + preferences->initializeSortingPreferences (); // set the text in the upper part of the frame setCaption ( tr ( "QashMoney" ) ); // Create new menubar for our mainwindow // and add menu items mainmenu = new QPEMenuBar ( this ); mainmenu->setFrameStyle ( QFrame::PopupPanel | QFrame::Raised ); preferencesmenu = new QPopupMenu ( this ); utilitiesmenu = new QPopupMenu ( this ); mainmenu->insertItem ( "Preferences", preferencesmenu ); mainmenu->insertItem ( "Utilities", utilitiesmenu ); preferencesmenu->insertItem ( "Date", this, SLOT ( displayDatePreferencesDialog () ) ); preferencesmenu->insertItem ( "Account", this, SLOT ( displayAccountPreferencesDialog () ) ); preferencesmenu->insertItem ( "Transaction", this, SLOT ( displayTransactionPreferencesDialog () ) ); utilitiesmenu->insertItem ( "Memory", this, SLOT ( displayMemoryDialog () ) ); @@ -140,76 +141,88 @@ void QashMoney::changeTabDisplay () transactiondisplay->listview->header()->setResizeEnabled ( FALSE, 3 ); // set the accountid and children variables transactiondisplay->setChildren ( children ); transactiondisplay->setAccountID ( accountid ); setTransactionDisplayDate (); // display transactions transactiondisplay->listview->clear(); QString displaytext = "%"; displaytext.prepend ( transactiondisplay->limitbox->text() ); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( transactiondisplay->listview, accountid, children, displaytext, newdate ); // display transfers - transfer->displayTransfers ( transactiondisplay->listview, accountid, children ); + transfer->displayTransfers ( transactiondisplay->listview, accountid, children, newdate ); // open a new preferences object and resize the transaction display columns // each column will have a different size based on whether we are looking at a child // account or children through a parent if ( parentaccountid != -1 || accountdisplay->listview->selectedItem()->childCount() == 0 ) // a parent with no children or a child - three columns { transactiondisplay->listview->setColumnWidth ( 0, preferences->getColumnPreference ( 3 ) ); // normal transaction date width transactiondisplay->listview->setColumnWidthMode ( 0, QListView::Manual ); transactiondisplay->listview->setColumnWidth ( 1, preferences->getColumnPreference ( 4 ) ); // normal transaction name width transactiondisplay->listview->setColumnWidthMode ( 1, QListView::Manual ); transactiondisplay->listview->setColumnWidth ( 2, preferences->getColumnPreference ( 5 ) ); // normal transaction amount width transactiondisplay->listview->setColumnWidthMode ( 2, QListView::Manual ); } else { transactiondisplay->listview->setColumnWidth ( 0, preferences->getColumnPreference ( 6 ) ); // extended transaction date width transactiondisplay->listview->setColumnWidthMode ( 0, QListView::Manual ); transactiondisplay->listview->setColumnWidth ( 1, preferences->getColumnPreference ( 7 ) ); // extended transaction name width transactiondisplay->listview->setColumnWidthMode ( 1, QListView::Manual ); transactiondisplay->listview->setColumnWidth ( 2, preferences->getColumnPreference ( 8 ) ); // extended transaction amount width transactiondisplay->listview->setColumnWidthMode ( 2, QListView::Manual ); transactiondisplay->listview->setColumnWidth ( 4, preferences->getColumnPreference ( 9 ) ); // transaction account width transactiondisplay->listview->setColumnWidthMode ( 4, QListView::Manual ); } + + // pull the column sorting preference from the preferences table, and configure the listview accordingly + int column = 0; + int direction = 0; + preferences->getSortingPreference ( 2, &column, &direction ); + transactiondisplay->listview->setSorting ( column, direction ); // show the window transactiondisplay->show(); // hide the account display and define accountid accountdisplay->hide(); // hide the budget display budgetdisplay->hide(); } else if ( maintabs->currentPageIndex() == 0 ) { disableOneTouchViewing(); // clear the account display selection accountdisplay->listview->clearSelection(); // resize the account display columns accountdisplay->listview->setColumnWidth ( 0, preferences->getColumnPreference ( 1 ) ); accountdisplay->listview->setColumnWidth ( 1, preferences->getColumnPreference ( 2 ) ); + // set sorting preference on account display columns + int column = 0; + int direction = 0; + preferences->getSortingPreference ( 1, &column, &direction ); + accountdisplay->listview->setSorting ( column, direction ); + // display the accounts if ( account->getNumberOfAccounts() != 0 ) account->displayAccounts ( accountdisplay->listview ); maintabs->setTabEnabled ( tab_2, FALSE ); // set the toggle button accountdisplay->setToggleButton (); // show the account display accountdisplay->show(); // hide the transaction display transactiondisplay->hide(); // hide the budget display budgetdisplay->hide(); @@ -249,33 +262,33 @@ void QashMoney::displayDatePreferencesDialog () if ( accountdisplay->listview->selectedItem()->parent() == 0 && accountdisplay->listview->selectedItem()->childCount() != 0 ) children = TRUE; else children = FALSE; // redisplay transactions if they are visible incorporating // any changes to the date format transactiondisplay->listview->clear(); QString displaytext = "%"; displaytext.prepend ( transactiondisplay->limitbox->text() ); setTransactionDisplayDate(); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( transactiondisplay->listview, accountid, children, displaytext, newdate ); if ( transfer->getNumberOfTransfers() != 0 ) - transfer->displayTransfers ( transactiondisplay->listview, accountid, children ); + transfer->displayTransfers ( transactiondisplay->listview, accountid, children, newdate ); } else if ( accountdisplay->isVisible() ) { accountdisplay->listview->clearSelection(); maintabs->setTabEnabled ( tab_2, FALSE ); } else budgetdisplay->updateBudgetInformation(); } void QashMoney::displayTransactionPreferencesDialog () { // display a dialog for setting preferences for transactions TransactionPreferences *td = new TransactionPreferences ( this ); td->exec (); if ( transactiondisplay->isVisible() ) @@ -287,33 +300,33 @@ void QashMoney::displayTransactionPreferencesDialog () bool children; if ( accountdisplay->listview->selectedItem()->parent() == 0 && accountdisplay->listview->selectedItem()->childCount() != 0 ) children = TRUE; else children = FALSE; // redisplay transactions incorporating any transaction preference changes transactiondisplay->listview->clear(); QString displaytext = "%"; displaytext.prepend ( transactiondisplay->limitbox->text() ); setTransactionDisplayDate(); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( transactiondisplay->listview, accountid, children, displaytext, newdate ); if ( transfer->getNumberOfTransfers() != 0 ) - transfer->displayTransfers ( transactiondisplay->listview, accountid, children ); + transfer->displayTransfers ( transactiondisplay->listview, accountid, children, newdate ); } else { accountdisplay->listview->clearSelection(); maintabs->setTabEnabled ( tab_2, FALSE ); } } void QashMoney::displayAccountPreferencesDialog () { // display a dialog for setting preferences for accounts AccountPreferences *ap = new AccountPreferences ( this ); ap->exec (); if ( accountdisplay->isVisible() && account->getNumberOfAccounts() != 0 ) { @@ -372,19 +385,19 @@ void QashMoney::setTransactionDisplayDate () break; case 1: // viewing one month newdate = today.addDays ( -30 ); break; case 2: // three months newdate = today.addDays ( -90 ); break; case 3: // six months newdate = today.addDays ( -180 ); break; case 4: // one year newdate = today.addDays ( -365 ); break; } } else - newdate = QDate ( 1, 1, 1000 ); + newdate = QDate ( 1900, 1, 1 ); } diff --git a/noncore/apps/qashmoney/transaction.cpp b/noncore/apps/qashmoney/transaction.cpp index 5ecc7ed..a3bd9e7 100755 --- a/noncore/apps/qashmoney/transaction.cpp +++ b/noncore/apps/qashmoney/transaction.cpp @@ -142,87 +142,163 @@ int Transaction::getDay ( int id ) int Transaction::getMonth ( int id ) { char **results; sqlite_get_table_printf ( tdb, "select month from transactions where transid= %i;", &results, NULL, NULL, NULL, id ); QString monthstring = results [ 1 ]; return monthstring.toInt(); } int Transaction::getYear ( int id ) { char **results; sqlite_get_table_printf ( tdb, "select year from transactions where transid= %i;", &results, NULL, NULL, NULL, id ); QString yearstring = results [ 1 ]; return yearstring.toInt(); } -void Transaction::displayTransactions ( QListView *listview, int id, bool children, const char *limit, QDate displaydate ) +char ** Transaction::selectAllTransactions ( QDate fromdate, bool children, const char *limit, int id ) { + // initialize variables + char **results; int showcleared = preferences->getPreference ( 3 ); - int year = ( displaydate.year() ) - 1; + QDate today = QDate::currentDate(); + int fromyear = fromdate.year(); + int toyear = today.year(); + int frommonth = fromdate.month(); + int tomonth = today.month(); + int fromday = fromdate.day(); - // select the transactions to display - // two different statements are used based on - // whether we are showing cleared transactions - char **results; - int rows, columns; - if ( showcleared == 0 ) + // construct the first part of the string + QString query = "select day, month, year, payee, amount, transid, accountid from transactions where"; + + if ( frommonth == tomonth && fromyear == toyear ) // our dates cross neither a month nor a year { - if ( account->getParentAccountID ( id ) == -1 && children == TRUE ) - sqlite_get_table_printf ( tdb, "select day, month, year, payee, amount, transid, accountid from transactions where cleared = 0 and year >= %i parentid = %i and payee like '%q';", &results, &rows, &columns, NULL, year, id, limit ); - else - sqlite_get_table_printf ( tdb, "select day, month, year, payee, amount, transid, accountid from transactions where cleared = 0 year >= %i accountid = %i and payee like '%q';", &results, &rows, &columns, NULL, year, id, limit ); + query.append ( " year = " ); + query.append ( QString::number ( toyear ) ); + query.append ( " and month = " ); + query.append ( QString::number ( tomonth ) ); + query.append ( " and day >= " ); + query.append ( QString::number ( fromday ) ); + query.append ( " and" ); } - else + else if ( frommonth != tomonth && fromyear == toyear ) // our dates cross a month within the same year { - if ( account->getParentAccountID ( id ) == -1 && children == TRUE ) - sqlite_get_table_printf ( tdb, "select day, month, year, payee, amount, transid, accountid from transactions where year >= %i and parentid = %i and payee like '%q';", &results, &rows, &columns, NULL, year, id, limit ); - else - sqlite_get_table_printf ( tdb, "select day, month, year, payee, amount, transid, accountid from transactions where accountid = %i and payee like '%q';", &results, &rows, &columns, NULL, id, limit ); + query.append ( " year = " ); + query.append ( QString::number ( toyear ) ); + query.append ( " and ( ( month <= " ); + query.append ( QString::number ( tomonth ) ); + query.append ( " and month > " ); + query.append ( QString::number ( frommonth ) ); + query.append ( " ) or ( month = " ); + query.append ( QString::number ( frommonth ) ); + query.append ( " and day >= " ); + query.append ( QString::number ( fromday ) ); + query.append ( " ) ) and " ); } + else if ( fromyear != toyear && fromyear != 1900 ) // here we are showing transactions from an entire year + { + // divide this taks into two parts - get the transactions from the prior and then the current year + // current year part + int tmpfrommonth = 1; // set temporary from months and days to Jan. 1 + int tmpfromday = 1; + query.append ( " ( year >= " ); + query.append ( QString::number ( fromyear ) ); + query.append ( " and ( month <= " ); + query.append ( QString::number ( tomonth ) ); + query.append ( " and month > " ); + query.append ( QString::number ( tmpfrommonth ) ); + query.append ( " ) or ( month = " ); + query.append ( QString::number ( tmpfrommonth ) ); + query.append ( " and day >= " ); + query.append ( QString::number ( tmpfromday ) ); + query.append ( " ) ) or" ); + + // prior year part + int tmptomonth = 12; + query.append ( " ( year = " ); + query.append ( QString::number ( fromyear ) ); + query.append ( " and ( ( month <= " ); + query.append ( QString::number ( tmptomonth ) ); + query.append ( " and month > " ); + query.append ( QString::number ( frommonth ) ); + query.append ( " ) or ( month = " ); + query.append ( QString::number ( frommonth ) ); + query.append ( " and day >= " ); + query.append ( QString::number ( fromday ) ); + query.append ( " ) ) ) and " ); + } + + if ( account->getParentAccountID ( id ) == -1 && children == TRUE ) + query.append ( " parentid = %i and payee like '%q';" ); + else + query.append ( " accountid = %i and payee like '%q';" ); + + sqlite_get_table_printf ( tdb, query, &results, &rows, &columns, NULL, id, limit ); + return results; + } + +char ** Transaction::selectNonClearedTransactions ( QDate fromdate, bool children, const char *limit, int id ) + { + char **results; + if ( account->getParentAccountID ( id ) == -1 && children == TRUE ) + sqlite_get_table_printf ( tdb, "select day, month, year, payee, amount, transid, accountid from transactions where cleared = 0 and parentid = %i and payee like '%q';", &results, &rows, &columns, NULL, id, limit ); + else + sqlite_get_table_printf ( tdb, "select day, month, year, payee, amount, transid, accountid from transactions where cleared = 0 and accountid = %i and payee like '%q';", &results, &rows, &columns, NULL, id, limit ); + return results; + } + +void Transaction::displayTransactions ( QListView *listview, int id, bool children, const char *limit, QDate displaydate ) + { + int showcleared = preferences->getPreference ( 3 ); + + char **results; + if ( showcleared == 0 ) + results = selectNonClearedTransactions ( displaydate, children, limit, id ); + else + results = selectAllTransactions ( displaydate, children, limit, id ); // iterate through the result list and display each item int counter = 7; while ( counter < ( ( rows + 1 ) * columns ) ) { - QDate displaydate ( atoi ( results [ counter + 2 ] ), atoi ( results [ counter + 1 ] ), atoi ( results [ counter ] ) ); + //QDate testdate ( atoi ( results [ counter + 2 ] ), atoi ( results [ counter + 1 ] ), atoi ( results [ counter ] ) ); QString date = preferences->getDate ( atoi ( results [ counter + 2 ] ), atoi ( results [ counter + 1 ] ), atoi ( results [ counter ] ) ); // construct transaction name, amount, id QString payee = results [ counter + 3 ]; QString amount = results [ counter + 4 ]; QString transferid = results [ counter + 5 ]; //determine the account name of the child accounts that we're displaying QString accountname = account->getAccountName ( atoi ( results [ counter + 6 ] ) ); - // fill in values + // fill in values if ( account->getParentAccountID ( id ) != -1 ) // use these constructors if we're showing a child account { if ( showcleared == 1 && getCleared ( transferid.toInt() ) == 1 ) - ColorListItem *item = new ColorListItem ( listview, date, payee, amount, transferid); + ColorListItem *item = new ColorListItem ( listview, date, payee, amount, transferid ); else QListViewItem *item = new QListViewItem ( listview, date, payee, amount, transferid ); } - else - { + else + { if ( showcleared == 1 && getCleared ( transferid.toInt() ) == 1 ) ColorListItem *item = new ColorListItem ( listview, date, payee, amount, transferid, accountname ); else QListViewItem *item = new QListViewItem ( listview, date, payee, amount, transferid, accountname ); - } + } // advance counter counter = counter + 7; } } QString Transaction::getBudgetTotal ( int budgetid, int lineitemid, int year, int month, int viewtype ) { // determine if we are viewing a years, months, or days budget // we have to pick a different sum for each char **results; switch ( viewtype ) { case 1: // we are viewing a year sqlite_get_table_printf ( tdb, "select abs ( sum ( amount ) ) from transactions where year = %i and amount < 0 and budgetid = %i and reservedone = %i;", &results, NULL, NULL, NULL, year, budgetid, lineitemid ); break; diff --git a/noncore/apps/qashmoney/transaction.h b/noncore/apps/qashmoney/transaction.h index 7297bb1..5871555 100755 --- a/noncore/apps/qashmoney/transaction.h +++ b/noncore/apps/qashmoney/transaction.h @@ -32,39 +32,42 @@ class Transaction // transactions for an account int getNumberOfTransactions ( int ); // deletes all transactions for the provided accountid void deleteAllTransactions ( int accountid ); QString getBudgetTotal ( int budgetid, int lineitemid, int year, int month, int viewtype ); QString getActualTotal ( int budgetid, int year, int month, int viewtype ); // These two functions clear budget ids is either a line item or an entire budget is deleted void clearBudgetIDs ( int, int ); void clearBudgetIDs ( int ); public slots: void displayTransactions ( QListView *, int, bool, const char *, QDate ); + char ** selectAllTransactions ( QDate fromdate, bool children, const char *limit, int id ); + char ** selectNonClearedTransactions ( QDate fromdate, bool children, const char *limit, int id ); QString getPayee ( int ); QString getTransactionDescription ( int ); QString getNumber ( int ); QString getAmount ( int ); QString getAbsoluteAmount ( int ); int getCleared ( int ); void setCleared ( int id, int cleared ); int getBudgetID ( int id ); int getLineItemID ( int id ); int getDay ( int ); int getMonth ( int ); int getYear ( int ); int getAccountID ( int id ); private: sqlite *tdb; + int rows, columns; }; #endif diff --git a/noncore/apps/qashmoney/transactiondisplay.cpp b/noncore/apps/qashmoney/transactiondisplay.cpp index ae6223d..1839cd2 100755 --- a/noncore/apps/qashmoney/transactiondisplay.cpp +++ b/noncore/apps/qashmoney/transactiondisplay.cpp @@ -54,32 +54,33 @@ TransactionDisplay::TransactionDisplay ( QWidget* parent ) : QWidget ( parent ) secondline = new QHBox ( this ); secondline->setSpacing ( 5 ); name = new QLabel ( secondline ); balance = new QLabel ( secondline ); QLabel *limit = new QLabel ( "Limit", secondline ); limitbox = new QLineEdit ( secondline ); limitbox->setMinimumWidth ( ( int ) ( this->width() / 6 ) ); connect ( limitbox, SIGNAL ( textChanged ( const QString & ) ), this, SLOT ( limitDisplay ( const QString & ) ) ); listview = new QListView ( this ); listview->setAllColumnsShowFocus ( TRUE ); listview->setShowSortIndicator ( TRUE ); listview->header()->setTracking ( FALSE ); connect ( listview->header(), SIGNAL ( sizeChange ( int, int, int ) ), this, SLOT ( saveColumnSize ( int, int, int ) ) ); + connect ( listview->header(), SIGNAL ( clicked ( int ) ), this, SLOT ( saveSortingPreference ( int ) ) ); layout = new QVBoxLayout ( this, 2, 2 ); layout->addWidget ( firstline ); layout->addWidget ( secondline ); layout->addWidget ( listview ); } void TransactionDisplay::addTransaction () { // create local variables int cleared = -1; // create new transaction window NewTransaction *newtransaction = new NewTransaction ( this ); int width = this->size().width(); newtransaction->transactionname->setMaximumWidth ( ( int ) ( width * 0.45 ) ); @@ -120,33 +121,33 @@ void TransactionDisplay::addTransaction () newtransaction->transactionnumber->text().toInt(), newtransaction->getDay(), newtransaction->getMonth(), newtransaction->getYear(), amount, cleared, newtransaction->getCurrentBudget(), newtransaction->getCurrentLineItem() ); else transaction->addTransaction ( newtransaction->getDescription(), newtransaction->transactionname->currentText(), accountid, account->getParentAccountID ( accountid ), newtransaction->transactionnumber->text().toInt(), defaultday, defaultmonth, defaultyear, amount, cleared, newtransaction->getCurrentBudget(), newtransaction->getCurrentLineItem() ); // redisplay transactions listview->clear(); QString displaytext = "%"; displaytext.prepend ( limitbox->text() ); setTransactionDisplayDate (); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( listview, accountid, children, displaytext, displaydate ); // redisplay transfers if ( transfer->getNumberOfTransfers() > 0 ) - transfer->displayTransfers ( listview, accountid, children ); + transfer->displayTransfers ( listview, accountid, children, displaydate ); // add the transaction amount to the account it's associated with // and update its parent account balance if necessary account->updateAccountBalance ( accountid ); if ( account->getParentAccountID ( accountid ) != -1 ) account->changeParentAccountBalance ( account->getParentAccountID ( accountid ) ); // format then reset the account balance redisplayAccountBalance (); } } void TransactionDisplay::checkListViewEdit () { if ( listview->selectedItem() == 0 ) QMessageBox::warning ( this, "QashMoney", "Please select a transaction\nto edit."); @@ -359,33 +360,33 @@ void TransactionDisplay::editTransaction () updateAndDisplay ( transaction->getAccountID ( transactionid ) ); } } void TransactionDisplay::updateAndDisplay ( int id ) { // redisplay transactions listview->clear(); QString displaytext = "%"; displaytext.prepend ( limitbox->text() ); setTransactionDisplayDate (); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( listview, accountid, children, displaytext, displaydate ); // redisplay transfers if ( transfer->getNumberOfTransfers() > 0 ) - transfer->displayTransfers ( listview, accountid, children ); + transfer->displayTransfers ( listview, accountid, children, displaydate ); // add the transaction amount to the account it's associated with // and update its parent account balance if necessary account->updateAccountBalance ( id ); if ( account->getParentAccountID ( id ) != -1 ) account->changeParentAccountBalance ( account->getParentAccountID ( id ) ); // format then reset the account balance redisplayAccountBalance (); } void TransactionDisplay::checkListViewDelete () { if ( listview->selectedItem() == 0 ) QMessageBox::warning ( this, "QashMoney", "Please select a transaction to\ndelete."); else @@ -403,65 +404,65 @@ void TransactionDisplay::deleteTransaction () // which is represented by accountid and the child account // which will be represented by childaccountid int childaccountid = -1; if ( listview->columns() == 5 ) childaccountid = transaction->getAccountID ( transactionid ); transaction->deleteTransaction ( transactionid ); listview->clear(); QString displaytext = "%"; displaytext.prepend ( limitbox->text() ); setTransactionDisplayDate (); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( listview, accountid, children, displaytext, displaydate ); if ( transfer->getNumberOfTransfers() > 0 ) - transfer->displayTransfers ( listview, accountid, children ); + transfer->displayTransfers ( listview, accountid, children, displaydate ); // if we are viewing different child accounts through the parent account // ie if there are five columns and the parentid is -1 // update the accountid ( which is the parent ) and update the child account // balance. Get its accountid from the transactionid account->updateAccountBalance ( accountid ); // will update either a parent or child if ( account->getParentAccountID ( accountid ) != -1 ) // update its parent if there is one account->changeParentAccountBalance ( account->getParentAccountID ( accountid ) ); if ( childaccountid != -1 ) // we've set childaccountid account->updateAccountBalance ( childaccountid ); // format then reset the account balance redisplayAccountBalance (); } else // takes care of deleting transfers { // get the accountids before we delete the transfer int fromaccountid = transfer->getFromAccountID ( transactionid ); int toaccountid = transfer->getToAccountID ( transactionid ); // delete the transfer and redisplay transactions transfer->deleteTransfer ( transactionid ); listview->clear(); QString displaytext = "%"; displaytext.prepend ( limitbox->text() ); setTransactionDisplayDate (); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( listview, accountid, children, displaytext, displaydate ); if ( transfer->getNumberOfTransfers() > 0 ) - transfer->displayTransfers ( listview, accountid, children ); + transfer->displayTransfers ( listview, accountid, children, displaydate ); // for the from account account->updateAccountBalance ( fromaccountid ); if ( account->getParentAccountID ( fromaccountid ) != -1 ) account->changeParentAccountBalance ( account->getParentAccountID ( fromaccountid ) ); // for the to account account->updateAccountBalance ( toaccountid ); if ( account->getParentAccountID ( toaccountid ) != -1 ) account->changeParentAccountBalance ( account->getParentAccountID ( toaccountid ) ); // format then reset the account balance redisplayAccountBalance (); } } @@ -488,33 +489,33 @@ void TransactionDisplay::toggleTransaction () else { if ( transfer->getCleared ( transactionid ) == 0 ) transfer->setCleared ( transactionid, 1 ); else transfer->setCleared ( transactionid, 0 ); } listview->clear(); QString displaytext = "%"; displaytext.prepend ( limitbox->text() ); setTransactionDisplayDate (); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( listview, accountid, children, displaytext, displaydate ); if ( transfer->getNumberOfTransfers() != 0 ) - transfer->displayTransfers ( listview, accountid, children ); + transfer->displayTransfers ( listview, accountid, children, displaydate ); } void TransactionDisplay::redisplayAccountBalance () { QString accountbalance = account->getAccountBalance ( accountid ); balance->setText ( accountbalance ); } void TransactionDisplay::setChildren ( bool c ) { children = c; } void TransactionDisplay::setAccountID ( int id ) { accountid = id; @@ -538,43 +539,48 @@ void ColorListItem::paintCell ( QPainter *p, const QColorGroup &cg, int column, { QColorGroup _cg ( cg ); _cg.setColor ( QColorGroup::Text, Qt::red ); QListViewItem::paintCell ( p, _cg, column, width, alignment ); } void TransactionDisplay::saveColumnSize ( int column, int oldsize, int newsize ) { if ( listview->columns() == 4 ) preferences->changeColumnPreference ( column + 3, newsize ); else if ( listview->columns() == 5 && column != 4 ) preferences->changeColumnPreference ( column + 6, newsize ); else preferences->changeColumnPreference ( 9, newsize ); } +void TransactionDisplay::saveSortingPreference ( int column ) + { + preferences->changeSortingPreference ( 2, column ); + } + void TransactionDisplay::limitDisplay ( const QString &text ) { listview->clear (); QString displaytext = "%"; displaytext.prepend ( text ); setTransactionDisplayDate (); if ( transaction->getNumberOfTransactions() > 0 ) transaction->displayTransactions ( listview, accountid, children, displaytext, displaydate ); if ( displaytext.length() == 1 || preferences->getPreference ( 6 ) == 1 ) - transfer->displayTransfers ( listview, accountid, children ); + transfer->displayTransfers ( listview, accountid, children, displaydate ); } int TransactionDisplay::getIDColumn () { int counter; int columns = listview->columns(); for ( counter = 0; counter <= columns; counter++ ) if ( listview->header()->label ( counter ).length() == 0 ) return counter; } void TransactionDisplay::showTransactionNotes () { if ( listview->selectedItem() == 0 || listview->currentItem()->text ( getIDColumn() ).toInt() < 0 ) QMessageBox::warning ( this, "QashMoney", "Please select a valid\ntransaction to view notes."); else @@ -606,18 +612,18 @@ void TransactionDisplay::setTransactionDisplayDate () break; case 1: // viewing one month displaydate = today.addDays ( -30 ); break; case 2: // three months displaydate = today.addDays ( -90 ); break; case 3: // six months displaydate = today.addDays ( -180 ); break; case 4: // one year displaydate = today.addDays ( -365 ); break; } } else - displaydate = QDate ( 1, 1, 1000 ); + displaydate = QDate ( 1900, 1, 1 ); } diff --git a/noncore/apps/qashmoney/transactiondisplay.h b/noncore/apps/qashmoney/transactiondisplay.h index 1746f6c..594776a 100755 --- a/noncore/apps/qashmoney/transactiondisplay.h +++ b/noncore/apps/qashmoney/transactiondisplay.h @@ -37,32 +37,33 @@ class TransactionDisplay : public QWidget void showTransactionNotes (); private slots: void addTransaction (); void editTransaction (); void editTransfer (); void deleteTransaction (); void toggleTransaction (); void checkListViewDelete (); void checkListViewEdit (); void checkListViewToggle (); void saveColumnSize ( int column, int oldsize, int newsize ); void limitDisplay ( const QString & ); void showCalculator (); void showCalendar (); void setTransactionDisplayDate (); + void saveSortingPreference ( int column ); private: int accountid, fromaccount, fromparent, toaccount, toparent, day, month, year, transferid; QDate displaydate; bool children; QBoxLayout *layout; QHBox *firstline; QHBox *secondline; void redisplayAccountBalance (); void updateAndDisplay ( int accountid ); }; #endif #ifndef COLORLISTITEM_H #define COLORLISTITEM_H diff --git a/noncore/apps/qashmoney/transfer.cpp b/noncore/apps/qashmoney/transfer.cpp index 77cbb4e..568d584 100755 --- a/noncore/apps/qashmoney/transfer.cpp +++ b/noncore/apps/qashmoney/transfer.cpp @@ -52,33 +52,33 @@ int Transfer::getNumberOfTransfers () { char **results; sqlite_get_table ( db, "select count() from transfers;", &results, 0, 0, 0 ); return atoi ( results [ 1 ] ); } int Transfer::getNumberOfTransfers ( int accountid ) { char **results; sqlite_get_table_printf ( db, "select count() from transfers where fromaccount = %i;", &results, 0, 0, 0, accountid ); int transfers = atoi ( results [ 1 ] ); sqlite_get_table_printf ( db, "select count() from transfers where toaccount = %i;", &results, 0, 0, 0, accountid ); transfers = transfers + atoi ( results [ 1 ] ); return transfers; } -void Transfer::displayTransfers ( QListView *listview, int accountid, bool children ) +void Transfer::displayTransfers ( QListView *listview, int accountid, bool children, QDate displaydate ) { int showcleared = preferences->getPreference ( 3 ); // select the from transfers to display char **results; int rows, columns; if ( account->getParentAccountID ( accountid ) == -1 && children == TRUE ) { if ( showcleared == 0 ) sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where cleared = 0 and toparent = %i;", &results, &rows, &columns, 0, accountid ); else sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where toparent = %i;", &results, &rows, &columns, 0, accountid ); } else { if ( showcleared == 0 ) @@ -87,60 +87,63 @@ void Transfer::displayTransfers ( QListView *listview, int accountid, bool child sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where toaccount = %i;", &results, &rows, &columns, 0, accountid ); } // iterate through the list and display the from items int counter = 7; int position = 0; while ( counter < ( ( rows + 1 ) * columns ) ) { // construct the date QString daystring = results [ counter ]; int day = daystring.toInt (); QString monthstring = results [ counter + 1 ]; int month = monthstring.toInt (); QString yearstring = results [ counter + 2 ]; int year = yearstring.toInt (); QString date = preferences->getDate ( year, month, day ); + QDate testdate ( year, month, day ); //construct the amount and id strings QString amount = results [ counter + 3 ]; QString id = results [ counter + 4 ]; // construct the transaction name QString transactionname = "FROM: "; QString temp1 = results [ counter + 5 ]; transactionname.append ( account->getAccountName ( temp1.toInt() ) ); QString toaccount = account->getAccountName ( atol ( results [ counter + 6 ] ) ); - // display this transfer - if ( account->getParentAccountID ( accountid ) == -1 ) + if ( testdate >= displaydate || showcleared == 0 ) { - if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) - ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id, toaccount ); + // display this transfer + if ( account->getParentAccountID ( accountid ) == -1 ) + { + if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) + ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id, toaccount ); + else + QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id, toaccount ); + } else - QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id, toaccount ); + { + if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) + ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id ); + else + QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id ); + } } - else - { - if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) - ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id ); - else - QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id ); - } - counter = counter + 7; } // select the to transfers to display char **toresults; rows = 0; columns = 0; if ( account->getParentAccountID ( accountid ) == -1 && children == TRUE ) { if ( showcleared == 0 ) sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where cleared = 0 and fromparent = %i;", &toresults, &rows, &columns, 0, accountid ); else sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where fromparent = %i;", &toresults, &rows, &columns, 0, accountid ); } else { @@ -150,59 +153,63 @@ void Transfer::displayTransfers ( QListView *listview, int accountid, bool child sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where fromaccount = %i;", &toresults, &rows, &columns, 0, accountid ); } // iterate through the list and display the from items counter = 7; position = 0; while ( counter < ( ( rows + 1 ) * columns ) ) { // construct the date QString daystring = toresults [ counter ]; int day = daystring.toInt (); QString monthstring = toresults [ counter + 1 ]; int month = monthstring.toInt (); QString yearstring = toresults [ counter + 2 ]; int year = yearstring.toInt (); QString date = preferences->getDate ( year, month, day ); + QDate testdate ( year, month, day ); //construct the amount and id strings QString amount = toresults [ counter + 3 ]; amount.prepend ( "-" ); QString id = toresults [ counter + 4 ]; // construct the transaction name QString transactionname = "TO: "; QString temp1 = toresults [ counter + 6 ]; transactionname.append ( account->getAccountName ( temp1.toInt() ) ); QString fromaccount = account->getAccountName ( atol ( toresults [ counter + 5 ] ) ); - // display this transfer - if ( account->getParentAccountID ( accountid ) == -1 ) - { - if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) - ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id, fromaccount ); - else - QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id, fromaccount ); - } - else - { - if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) - ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id ); + if ( testdate >= displaydate || showcleared == 0 ) + { + // display this transfer + if ( account->getParentAccountID ( accountid ) == -1 ) + { + if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) + ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id, fromaccount ); + else + QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id, fromaccount ); + } else - QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id ); + { + if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 ) + ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id ); + else + QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id ); + } } counter = counter + 7; } } int Transfer::getCleared ( int id ) { char **results; sqlite_get_table_printf ( db, "select cleared from transfers where transferid= %i;", &results, 0, 0, 0, id ); return atoi ( results [ 1 ] ); } void Transfer::setCleared ( int id, int cleared ) { sqlite_exec_printf ( db, "update transfers set cleared = %i where transferid = %i;", 0, 0, 0, cleared, id ); diff --git a/noncore/apps/qashmoney/transfer.h b/noncore/apps/qashmoney/transfer.h index 33dedf4..e910e7c 100755 --- a/noncore/apps/qashmoney/transfer.h +++ b/noncore/apps/qashmoney/transfer.h @@ -1,48 +1,49 @@ #ifndef TRANSFER_H #define TRANSFER_H #include <qlistview.h> #include <qstring.h> #include <sqlite.h> +#include <qdatetime.h> #include "preferences.h" class Transfer { public: Transfer (); ~Transfer (); // This function adds a new transfer to the database. It takes the fromaccount, toaccount, // number, frombudget, tobudget, day, month, year, amount, cleared void addTransfer ( int fromaccount, int fromparent, int toaccount, int toparent, int day, int month, int year, float amount, int cleared ); void updateTransfer ( int fromaccount, int fromparent, int toaccount, int toparent, int day, int month, int year, float amount, int cleared, int transferid ); // Deletes a transfer. Takes the transferid as its parameter void deleteTransfer ( int ); // Deletes all transfers for a given accountid void deleteAllTransfers ( int accountid ); // Returns the number of checking transfers int getNumberOfTransfers (); int getNumberOfTransfers ( int accountid ); - void displayTransfers ( QListView *listview, int accountid, bool children ); + void displayTransfers ( QListView *listview, int accountid, bool children, QDate displaydate ); int getCleared ( int id ); void setCleared ( int id, int cleared ); int getFromAccountID ( int id ); int getToAccountID ( int id ); int getDay ( int id ); int getMonth ( int id ); int getYear ( int id ); QString getAmount ( int id ); private: sqlite *db; }; #endif diff --git a/noncore/apps/qashmoney/transferdialog.cpp b/noncore/apps/qashmoney/transferdialog.cpp index 7bc3eb0..f85c740 100755 --- a/noncore/apps/qashmoney/transferdialog.cpp +++ b/noncore/apps/qashmoney/transferdialog.cpp @@ -84,31 +84,31 @@ void TransferDialog::showCalendar () date->setText ( preferences->getDate ( year, month, day ) ); } } int TransferDialog::getDay () { return day; } int TransferDialog::getMonth () { return month; } int TransferDialog::getYear () { - return day; + return year; } void TransferDialog::showCalculator () { Calculator *calculator = new Calculator ( this ); if ( calculator->exec () == QDialog::Accepted ) amount->setText ( calculator->display->text() ); } |