From cedb13c3ec59d2c8df30e7659347de9785e2e7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Wed, 17 Nov 2010 21:09:41 +0100 Subject: [PATCH] Fix a looooooooot of bugs --- ressources/po/french.po | 2 +- src/controller/KissCount.cpp | 15 +++- src/controller/KissCount.h | 2 +- src/model/User.cpp | 2 +- src/view/grid/GridAccount.cpp | 160 ++++++++++++++++++++++------------ src/view/grid/GridAccount.h | 4 +- 6 files changed, 121 insertions(+), 64 deletions(-) diff --git a/ressources/po/french.po b/ressources/po/french.po index e539dab..0d9af51 100644 --- a/ressources/po/french.po +++ b/ressources/po/french.po @@ -31,7 +31,7 @@ msgstr " - " #: src/view/PreferencesPanel.cpp:679 #: src/view/PreferencesPanel.cpp:725 msgid " already exists" -msgstr " existe déjà " +msgstr " existe déjà " #: src/view/SearchPanel.cpp:222 msgid " entries found" diff --git a/src/controller/KissCount.cpp b/src/controller/KissCount.cpp index 644f5e2..a68eaaa 100644 --- a/src/controller/KissCount.cpp +++ b/src/controller/KissCount.cpp @@ -161,6 +161,14 @@ wxString KissCount::AddAccount(Account& ac) return ac.id; } +bool sortAccounts(Account ac1, Account ac2) +{ + if (ac1._default) return true; + if (ac2._default) return false; + + return (ac1.name.Cmp(ac2.name) < 0); +} + void KissCount::UpdateAccount(Account& ac) { std::vector::iterator it; @@ -170,6 +178,9 @@ void KissCount::UpdateAccount(Account& ac) for (i=0, it=_user->_accounts.begin(); it !=_user->_accounts.end(); it++, i++) if (it->id == ac.id) _user->_accounts[i] = ac; + + if (ac._default) + std::sort(_user->_accounts.begin(), _user->_accounts.end(), sortAccounts); } void KissCount::DeleteAccount(Account& ac) @@ -389,7 +400,7 @@ std::vector* KissCount::Search(wxString* description, wxDateTime* dat return _db->Search(_user, description, dateFrom, dateTo, amountFrom, amountTo, categories, Fix, accounts, true); } -bool KissCount::SearchPreviousOperation(Operation* res, wxString& description, int month, int year) +bool KissCount::SearchPreviousOperation(Operation* res, Operation& op, int month, int year) { std::vector* operations; wxDateTime* date ; @@ -405,7 +416,7 @@ bool KissCount::SearchPreviousOperation(Operation* res, wxString& description, i date = new wxDateTime(0, (wxDateTime::Month)month, year); - operations = _db->Search(_user, &description, date, NULL, NULL, NULL, v, BOTH, v, false); + operations = _db->Search(_user, &op.description, date, NULL, NULL, NULL, v, op.fix_cost ? FIX_OP : NON_FIX_OP, v, false); delete date; diff --git a/src/controller/KissCount.h b/src/controller/KissCount.h index b37bb2a..1e14609 100644 --- a/src/controller/KissCount.h +++ b/src/controller/KissCount.h @@ -84,7 +84,7 @@ public: wxString* amountFrom, wxString* amountTo, std::vector categories, int Fix, std::vector accounts); - bool SearchPreviousOperation(Operation* res, wxString& description, int month, int year); + bool SearchPreviousOperation(Operation* res, Operation& op, int month, int year); void GetStats(int monthFrom, int yearFrom, int monthTo, int yearTo, std::map > >* accountAmounts, diff --git a/src/model/User.cpp b/src/model/User.cpp index 359a486..8a905f5 100644 --- a/src/model/User.cpp +++ b/src/model/User.cpp @@ -51,7 +51,7 @@ Category User::GetCategory(wxString& catId) cat.parent = wxT("0"); cat.name = _("Unknown"); cat.font = wxT(""); - cat.backcolor = wxColour(0xFF, 0xFF, 0xFF); + cat.backcolor = OWN_GREEN; cat.forecolor = wxColour(0x00, 0x00, 0x00); return cat; diff --git a/src/view/grid/GridAccount.cpp b/src/view/grid/GridAccount.cpp index 7506bb6..f540aa2 100644 --- a/src/view/grid/GridAccount.cpp +++ b/src/view/grid/GridAccount.cpp @@ -42,7 +42,7 @@ END_EVENT_TABLE() enum {GRID_ID}; GridAccount::GridAccount(KissCount* kiss, wxWindow *parent, wxWindowID id) : wxGrid(parent, id), _fixCosts(0), _week1(0), _week2(0), _week3(0), _week4(0), _kiss(kiss), - _curMonth(0), _curYear(0) + _loadOperations(false), _curMonth(0), _curYear(0) { wxBitmap deleteBitmap(wxT(DELETE_ICON)); wxBitmap checkedBitmap(wxT(CHECKED_ICON)); @@ -173,6 +173,7 @@ void GridAccount::LoadOperations(std::vector* operations, bool canAdd NULLop.id = wxT(""); + _loadOperations = true; _operations = operations; _canAddOperation = canAddOperation; _curMonth = month; @@ -180,7 +181,7 @@ void GridAccount::LoadOperations(std::vector* operations, bool canAdd _displayedOperations.clear(); _displayedOperations.push_back(NULLop); // Header _fixCosts = 0; - + it = _operations->begin(); for (;it != _operations->end() && it->fix_cost; it++) @@ -215,41 +216,46 @@ void GridAccount::LoadOperations(std::vector* operations, bool canAdd AutoSizeColumn(ACCOUNT, false); AutoSizeColumn(DELETE, false); AutoSizeColumn(CHECKED, false); + + _loadOperations = false; } -void GridAccount::InsertOperationWithWeek(User* user, Operation& op, int line, bool fix, int month, int year) +void GridAccount::ComputeWeeks() { std::vector::iterator it; int curLine, curWeek, week, i; + for (it = _displayedOperations.begin(), curLine=0; + it != _displayedOperations.end(); + it++, curLine++) + { + if (it->id.Length() && !it->fix_cost) break; + } + + if (it == _displayedOperations.end()) return; + + ResetWeeks(); + + curWeek = wxDateTime(it->day+1, (wxDateTime::Month)it->month, it->year).GetWeekOfMonth(); + it++; + for (i=1; it != _displayedOperations.end(); it++, curLine++) + { + if (!it->id.Length()) continue; + week = wxDateTime(it->day+1, (wxDateTime::Month)it->month, it->year).GetWeekOfMonth(); + if (week != curWeek) + { + SetWeek(i++, curLine); + curWeek = week; + } + } +} + +void GridAccount::InsertOperationWithWeek(User* user, Operation& op, int line, bool fix, int month, int year) +{ InsertOperation(user, op, line, fix, month, year); if (op.id.Length() && !fix) - { - for (it = _displayedOperations.begin(), curLine=0; - it != _displayedOperations.end(); - it++, curLine++) - { - if (it->id.Length() && !it->fix_cost) break; - } - - if (it == _displayedOperations.end()) return; - - ResetWeeks(); - - curWeek = wxDateTime(it->day+1, (wxDateTime::Month)it->month, it->year).GetWeekOfMonth(); - it++; - for (i=1; it != _displayedOperations.end(); it++, curLine++) - { - if (!it->id.Length()) continue; - week = wxDateTime(it->day+1, (wxDateTime::Month)it->month, it->year).GetWeekOfMonth(); - if (week != curWeek) - { - SetWeek(i++, curLine); - curWeek = week; - } - } - } + ComputeWeeks(); } void GridAccount::InsertOperation(User* user, Operation& op, int line, bool fix, int month, int year) @@ -358,15 +364,23 @@ void GridAccount::InsertOperation(User* user, Operation& op, int line, bool fix, SetCellValue(line, DEBIT, wxString::Format(wxT("%.2lf"), amount)); SetCellValue(line, CREDIT, wxString::Format(wxT("%.2lf"), amount)); } + + if (!_loadOperations) + { + if (op.meta) + AutoSizeColumn(TREE, false); + AutoSizeColumn(CATEGORY, false); + AutoSizeColumn(ACCOUNT, false); + } } else { SetCellEditor(line, DATE, new CalendarEditor(0, month, year)); - if (!fix && - curDate.GetMonth() == month && + if (curDate.GetMonth() == month && curDate.GetYear() == year) { - SetCellValue(line, DATE, wxString::Format(wxT("%02d/%02d/%d"), curDate.GetDay(), month+1, year)); + if (!fix) + SetCellValue(line, DATE, wxString::Format(wxT("%02d/%02d/%d"), curDate.GetDay(), month+1, year)); SetCellEditor(line, DATE, new CalendarEditor(curDate.GetDay()-1, month, year)); } else @@ -444,31 +458,36 @@ void GridAccount::InsertIntoGrid(Operation& op) int i, a; User* user = _kiss->GetUser(); - for(i=0; i<(int)_displayedOperations.size(); i++) + // No previous fix operations + if (op.fix_cost && !_displayedOperations[1].id.Length()) + i = 1; + else { - if (!_displayedOperations[i].id.Length()) continue; - if (_displayedOperations[i].parent.Length()) continue; - if ((_displayedOperations)[i].fix_cost && !op.fix_cost) continue; - if (!(_displayedOperations)[i].fix_cost && op.fix_cost) break; - if (user->_preferences[wxT("operation_order")] == wxT("ASC")) + for(i=0; i<(int)_displayedOperations.size(); i++) { - if ((_displayedOperations)[i].day > op.day) - break; + if (!_displayedOperations[i].id.Length()) continue; + if (_displayedOperations[i].parent.Length()) continue; + if ((_displayedOperations)[i].fix_cost && !op.fix_cost) continue; + if (!(_displayedOperations)[i].fix_cost && op.fix_cost) break; + if (user->_preferences[wxT("operation_order")] == wxT("ASC")) + { + if ((_displayedOperations)[i].day > op.day) + break; + } + else + { + if ((_displayedOperations)[i].day < op.day) + break; + } + } - } - else - { - if ((_displayedOperations)[i].day < op.day) - break; - } + if (i == (int)_displayedOperations.size() || + i == _fixCosts) + i--; + else if (!(_displayedOperations)[i].fix_cost && op.fix_cost) + i --; } - if (i == (int)_displayedOperations.size() || - i == _fixCosts) - i--; - else if (!(_displayedOperations)[i].fix_cost && op.fix_cost) - i --; - for (a=0; a<(int)_operations->size(); a++) { if ((*_operations)[a].fix_cost && !op.fix_cost) continue; @@ -483,7 +502,8 @@ void GridAccount::InsertIntoGrid(Operation& op) break; } } - + + if (a < 0) a = 0; _operations->insert(_operations->begin()+a, op); InsertOperationWithWeek(user, (*_operations)[a], i, op.fix_cost, _curMonth, _curYear); @@ -583,7 +603,7 @@ void GridAccount::OnOperationModified(wxGridEvent& event) User* user = _kiss->GetUser(); int row = event.GetRow(); int col = event.GetCol(); - Operation new_op, cur_op, op_tmp; + Operation new_op, cur_op, op_tmp, op_tmp2; int op_complete = 6, i; wxString value ; wxDateTime date; @@ -614,7 +634,7 @@ void GridAccount::OnOperationModified(wxGridEvent& event) for (i=1, it=op.childs.begin(); it!=op.childs.end(); it++, i++) { op2 = GetOperation(*it); - InsertOperation(user, op2, row+i, op2.fix_cost, _curMonth, _curYear); + InsertOperationWithWeek(user, op2, row+i, op2.fix_cost, _curMonth, _curYear); } } else @@ -696,7 +716,8 @@ void GridAccount::OnOperationModified(wxGridEvent& event) (!GetCellValue(row, CATEGORY).Length() || !GetCellValue(row, ACCOUNT).Length())) { - if (_kiss->SearchPreviousOperation(&op_tmp, new_op.description, _curMonth, _curYear)) + new_op.fix_cost = row <= _fixCosts; + if (_kiss->SearchPreviousOperation(&op_tmp, new_op, _curMonth, _curYear)) { new_op.category = op_tmp.category; new_op.account = op_tmp.account; @@ -751,7 +772,8 @@ void GridAccount::OnOperationModified(wxGridEvent& event) SET_ROW_COLOR(row2, color, user->GetCategory(op2.category).forecolor); } - } + } + event.Skip(); return; } } @@ -795,16 +817,26 @@ void GridAccount::OnOperationModified(wxGridEvent& event) _kiss->DeleteOperation(cur_op); _displayedOperations.erase(_displayedOperations.begin()+row); - if (cur_op.parent.Length() && op_tmp.childs.size() <= 1) + if (cur_op.parent.Length() && op_tmp.childs.size() < 2) { + if (op_tmp.childs.size() == 1) + { + op_tmp2 = GetOperation(op_tmp.childs[0]); + op_tmp2.parent = wxT(""); + UpdateOperation(op_tmp2); + row = GetDisplayedRow(op_tmp2.id); + _displayedOperations[row] = op_tmp2; + } row = GetDisplayedRow(cur_op.parent); DeleteRows(row, 1); DeleteOperation(op_tmp); _kiss->DeleteOperation(op_tmp); _displayedOperations.erase(_displayedOperations.begin()+row); + _fixCosts--; } + _fixCosts--; + ComputeWeeks(); } - _fixCosts = _fixCosts--; inModification = false ; event.Skip(); return ; @@ -896,12 +928,22 @@ void GridAccount::OnOperationModified(wxGridEvent& event) if (cur_op.parent.Length() && op_tmp.childs.size() <= 1) { + if (op_tmp.childs.size() == 1) + { + op_tmp2 = GetOperation(op_tmp.childs[0]); + op_tmp2.parent = wxT(""); + UpdateOperation(op_tmp2); + row = GetDisplayedRow(op_tmp2.id); + _displayedOperations[row] = op_tmp2; + } row = GetDisplayedRow(cur_op.parent); DeleteRows(row, 1); DeleteOperation(op_tmp); _kiss->DeleteOperation(op_tmp); _displayedOperations.erase(_displayedOperations.begin()+row); } + + ComputeWeeks(); } inModification = false ; event.Skip(); @@ -1354,4 +1396,6 @@ removeLastGroup: UpdateOperation(op2); } + + ComputeWeeks(); } diff --git a/src/view/grid/GridAccount.h b/src/view/grid/GridAccount.h index 139d876..7b156c7 100644 --- a/src/view/grid/GridAccount.h +++ b/src/view/grid/GridAccount.h @@ -64,11 +64,13 @@ private: KissCount* _kiss; wxString* _categories, *_accounts; std::vector* _operations; - bool _canAddOperation; + bool _canAddOperation, _loadOperations; int _curMonth, _curYear; void SetWeek(int week, int line); void ResetWeeks(); + void ComputeWeeks(); + void InsertIntoGrid(Operation& op); void DeleteOperation(const Operation& op); void UpdateMeta(Operation& op);