Fix a lot of bugs (again)

This commit is contained in:
Grégory Soutadé 2010-11-23 21:06:01 +01:00
parent 16891b0ae6
commit c88c3b4836
3 changed files with 118 additions and 63 deletions

11
TODO
View File

@ -1,4 +1,4 @@
Version 0.1
Version 0.2
Statistics (need to add months/years label on graph)
Auto completion (already up into wxwidgets 2.9)
@ -6,21 +6,20 @@ Using tabulation to navigate throw interface (Search Panel)
Improve Scrolled Windows and widgets placement
Can type a letter with a comboboxes
Windows version
Need packaging
Better build system for wxFreeChart (hacked by me)
Need packaging (.deb)
Cool for 0.1:
Cool for 0.2:
Database auto saving at startup
Use caches for created panels (avoid destroying/creating panels for nothing)
Add search function to web view
Need optimizations by caching operations and categories
Need optimizations by caching operations and categories (using hastables)
===============================================================
Next version
More translations
Import/Export module
Printing (maybe in html)
Printing (maybe in xml/html)
Refactor web view code
Plugins ?

View File

@ -42,7 +42,8 @@ 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),
_loadOperations(false), _curMonth(0), _curYear(0)
_loadOperations(false),
_curMonth(0), _curYear(0)
{
wxBitmap deleteBitmap(wxT(DELETE_ICON));
wxBitmap checkedBitmap(wxT(CHECKED_ICON));
@ -107,12 +108,15 @@ wxPen GridAccount::GetColGridLinePen (int col)
{return wxPen(*wxBLACK, 1, wxSOLID);}
wxPen GridAccount::GetRowGridLinePen (int row) {
if (_canAddOperation)
{
if (row == 0 || row == _fixCosts ||
row == _week1 ||
row == _week2 ||
row == _week3 ||
row == _week4)
return wxPen(*wxBLACK, 1, wxSOLID);
}
return GetCellBackgroundColour(row, 0);
}
@ -149,8 +153,8 @@ void GridAccount::UpdateOperation(Operation& op)
for(i=0; i < (int)_operations->size(); i++)
if ((*_operations)[i].id == op.id)
{
(*_operations)[i] = op;
_kiss->UpdateOperation(op);
(*_operations)[i] = op;
break;
}
}
@ -184,6 +188,8 @@ void GridAccount::LoadOperations(std::vector<Operation>* operations, bool canAdd
it = _operations->begin();
if (_canAddOperation)
{
for (;it != _operations->end() && it->fix_cost; it++)
{
if (it->parent.Length()) continue;
@ -194,7 +200,6 @@ void GridAccount::LoadOperations(std::vector<Operation>* operations, bool canAdd
InsertOperation(user, *it, ++curLine, true, it->month, it->year);
}
if (canAddOperation)
InsertOperation(user, NULLop, ++curLine, true, month, year);
for (; it != _operations->end(); it++)
@ -207,8 +212,17 @@ void GridAccount::LoadOperations(std::vector<Operation>* operations, bool canAdd
InsertOperation(user, *it, ++curLine, false, it->month, it->year);
}
if (canAddOperation)
InsertOperation(user, NULLop, ++curLine, false, month, year);
}
else
{
for (;it != _operations->end(); it++)
{
if (it->parent.Length()) continue;
InsertOperation(user, *it, ++curLine, true, it->month, it->year);
}
}
AutoSizeColumn(TREE, false);
AutoSizeColumn(CATEGORY, false);
@ -225,6 +239,8 @@ void GridAccount::ComputeWeeks()
std::vector<Operation>::iterator it;
int curLine, curWeek, week, i;
if (!_canAddOperation) return;
for (it = _displayedOperations.begin(), curLine=0;
it != _displayedOperations.end();
it++, curLine++)
@ -240,7 +256,7 @@ void GridAccount::ComputeWeeks()
it++;
for (i=1; it != _displayedOperations.end(); it++, curLine++)
{
if (!it->id.Length()) continue;
if (!it->id.Length() || it->parent.Length()) continue;
week = wxDateTime(it->day+1, (wxDateTime::Month)it->month, it->year).GetWeekOfMonth();
if (week != curWeek)
{
@ -455,15 +471,21 @@ void GridAccount::DeleteOperation(const Operation& op)
void GridAccount::InsertIntoGrid(Operation& op)
{
int i, a;
int i, a, start;
User* user = _kiss->GetUser();
Operation parent;
// No previous fix operations
if (op.fix_cost && !_displayedOperations[1].id.Length())
i = 1;
else
{
for(i=0; i<(int)_displayedOperations.size(); i++)
if (op.parent.Length())
start = GetDisplayedRow(op.parent);
else
start = 0;
for(i=start; i<(int)_displayedOperations.size(); i++)
{
if (!_displayedOperations[i].id.Length()) continue;
if (_displayedOperations[i].parent.Length()) continue;
@ -481,7 +503,15 @@ void GridAccount::InsertIntoGrid(Operation& op)
}
}
if (i == (int)_displayedOperations.size() ||
if (op.parent.Length())
{
parent = GetOperation(op.parent);
if ((i-start) > (int)(parent.childs.size()))
i = start + parent.childs.size();
if (parent.day >= op.day)
i = start + 1;
}
else if (i == (int)_displayedOperations.size() ||
i == _fixCosts)
i--;
else if (!(_displayedOperations)[i].fix_cost && op.fix_cost)
@ -509,7 +539,7 @@ void GridAccount::InsertIntoGrid(Operation& op)
InsertOperationWithWeek(user, (*_operations)[a], i, op.fix_cost, _curMonth, _curYear);
}
void GridAccount::RemoveMeta(Operation& op, int line, bool removeRoot, bool deleteOp)
void GridAccount::RemoveMeta(Operation op, int line, bool removeRoot, bool deleteOp)
{
std::vector<Operation*>::iterator it, it2;
wxGridCellTreeButtonRenderer* treeRenderer;
@ -604,7 +634,7 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
int row = event.GetRow();
int col = event.GetCol();
Operation new_op, cur_op, op_tmp, op_tmp2;
int op_complete = 6, i;
int op_complete = 6, i, last_day;
wxString value ;
wxDateTime date;
bool need_insertion = false, fix_op=false;
@ -644,6 +674,7 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
treeRenderer->DecRef();
ComputeWeeks();
inModification = false;
return;
}
@ -856,7 +887,6 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
DeleteOperation(cur_op);
_displayedOperations.erase(_displayedOperations.begin()+row);
_fixCosts--;
UpdateOperation(new_op);
}
else
{
@ -956,7 +986,6 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
DeleteRows(row, 1);
DeleteOperation(cur_op);
_displayedOperations.erase(_displayedOperations.begin()+row);
UpdateOperation(new_op);
}
else
{
@ -993,7 +1022,10 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
wxMessageBox(_("You made a debit on a blocked account"), _("Warning"), wxICON_WARNING | wxOK);
if (need_insertion)
{
InsertIntoGrid(new_op);
UpdateOperation(new_op);
}
if (new_op.parent.Length())
{
@ -1001,6 +1033,8 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
new_op = _displayedOperations[row];
last_day = new_op.day;
UpdateMeta(new_op);
_displayedOperations[row] = new_op;
@ -1032,6 +1066,8 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
SET_ROW_FONT(row, font);
}
SetCellValue(row, DATE, wxString::Format(wxT("%02d/%02d/%d"), new_op.day+1, _curMonth+1, _curYear));
if (!_displayedOperations[row].amount)
{
amount = _kiss->MetaPositiveAmount(new_op.id);
@ -1052,6 +1088,23 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
SetCellValue(row, CREDIT, wxString::Format(wxT("%.2lf"), new_op.amount));
}
}
// Move updated meta
if ((int)new_op.day != last_day)
{
int i;
RemoveMeta(new_op, row, true, false);
InsertIntoGrid(new_op);
row = GetDisplayedRow(new_op.id);
for (i=1, it=new_op.childs.begin(); it!=new_op.childs.end(); it++, i++)
{
op2 = GetOperation(*it);
InsertOperationWithWeek(user, op2, row+i, op2.fix_cost, _curMonth, _curYear);
}
treeRenderer = (wxGridCellTreeButtonRenderer*) GetCellRenderer(row, 0);
treeRenderer->Invert();
treeRenderer->DecRef();
}
}
inModification = false ;
@ -1059,51 +1112,53 @@ void GridAccount::OnOperationModified(wxGridEvent& event)
event.Skip();
}
void GridAccount::UpdateMeta(Operation& op)
void GridAccount::UpdateMeta(Operation& meta)
{
std::vector<wxString>::iterator it;
Operation op_ ;
Operation op ;
wxString category = wxT("");
bool updateCat = false ;
op.category = wxT("");
op.checked = true;
op.amount = 0;
if (!meta.childs.size()) return ;
for(it=op.childs.begin(); it!=op.childs.end(); it++)
meta.category = wxT("");
meta.checked = true;
meta.amount = 0;
for(it=meta.childs.begin(); it!=meta.childs.end(); it++)
{
op_ = GetOperation(*it);
if (op_.year <= op.year && op_.month <= op.month && op_.day < op.day)
op = GetOperation(*it);
if (op.year <= meta.year && op.month <= meta.month && op.day < meta.day)
{
op.year = op_.year;
op.month = op_.month;
op.day = op_.day;
meta.year = op.year;
meta.month = op.month;
meta.day = op.day;
}
op.checked &= op_.checked;
if (!op.description.Length() && op_.description.Length())
op.description = op_.description;
meta.checked &= op.checked;
if (!meta.description.Length() && op.description.Length())
meta.description = op.description;
if (!category.Length())
{
if (op_.category.Length())
if (op.category.Length())
{
category = op_.category;
category = op.category;
updateCat = true;
}
}
else
{
if (op_.category.Length() && op_.category != category)
if (op.category.Length() && op.category != category)
updateCat = false;
}
op_.parent = op.id;
op.parent = meta.id;
}
if (updateCat)
op.category = category;
meta.category = category;
op.amount = _kiss->MetaAmount(op.id);
meta.amount = _kiss->MetaAmount(meta.id);
UpdateOperation(op);
UpdateOperation(meta);
}

View File

@ -62,6 +62,7 @@ public:
private:
KissCount* _kiss;
bool _displayLines;
wxString* _categories, *_accounts;
std::vector<Operation>* _operations;
bool _canAddOperation, _loadOperations;
@ -74,7 +75,7 @@ private:
void InsertIntoGrid(Operation& op);
void DeleteOperation(const Operation& op);
void UpdateMeta(Operation& op);
void RemoveMeta(Operation& op, int line, bool removeRoot, bool deleteOp);
void RemoveMeta(Operation op, int line, bool removeRoot, bool deleteOp);
void CheckMeta(Operation& op, int line, bool check);
Operation& GetOperation(const wxString& id);