From 8ff39c01e9d21c5ce3119f0e099e2b4b45bc8485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Mon, 4 Oct 2010 22:10:21 +0200 Subject: [PATCH] * Improve check/uncheck on grouped operations --- src/view/grid/GridAccount.cpp | 108 +++++++++++++++++++++++++++++----- src/view/grid/GridAccount.h | 2 + 2 files changed, 94 insertions(+), 16 deletions(-) diff --git a/src/view/grid/GridAccount.cpp b/src/view/grid/GridAccount.cpp index bae280c..a9f4cd0 100644 --- a/src/view/grid/GridAccount.cpp +++ b/src/view/grid/GridAccount.cpp @@ -140,6 +140,19 @@ Operation& GridAccount::GetOperation(const wxString& id) return *it; } +void GridAccount::UpdateOperation(Operation& op) +{ + std::vector::iterator it; + + for(it=_operations->begin(); it!=_operations->end(); it++) + if (it->id == op.id) + { + *it = op; + _kiss->UpdateOperation(op); + break; + } +} + int GridAccount::GetDisplayedRow(const wxString& id) { for(int i=0; i<(int)_displayedOperations.size(); i++) @@ -455,7 +468,6 @@ void GridAccount::InsertIntoGrid(Operation& op) InsertOperationWithWeek(user, (*_operations)[_operations->size()-1], i, op.fix_cost, _curMonth, _curYear); } -/* !!! op must not be a reference because we modify _displayedOerations !!! */ void GridAccount::RemoveMeta(Operation& op, int line, bool removeRoot, bool deleteOp) { std::vector::iterator it, it2; @@ -503,6 +515,47 @@ void GridAccount::RemoveMeta(Operation& op, int line, bool removeRoot, bool dele treeRenderer->DecRef(); } +void GridAccount::CheckMeta(Operation& op, int line, bool check) +{ + std::vector::iterator it, it2; + wxGridCellTreeButtonRenderer* treeRenderer; + int i; + Operation op2; + wxColour color ; + unsigned char r, g, b; + User* user = _kiss->GetUser(); + + treeRenderer = (wxGridCellTreeButtonRenderer*) GetCellRenderer(line, TREE); + + for(i=0; i<(int)op.childs.size(); i++) + { + op2 = GetOperation(op.childs[i]); + op2.checked = check; + UpdateOperation(op2); + + if (op2.meta) + CheckMeta(op2, line+1, check); + + if (treeRenderer->IsCollapsed()) + { + SetCellValue(line+i+1, CHECKED, check ? wxT("1") : wxT("0")); + color = user->GetCategory(op2.category).backcolor; + + if (check) + { + r = ((color.Red()*1.5) >= 0xFF) ? 0xFF : color.Red()*1.5 ; + g = ((color.Green()*1.5) >= 0xFF) ? 0xFF : color.Green()*1.5 ; + b = ((color.Blue()*1.5) >= 0xFF) ? 0xFF : color.Blue()*1.5 ; + color.Set(r, g, b, color.Alpha()); + } + + SET_ROW_COLOR(line+i+1, color, user->GetCategory(op2.category).forecolor); + } + } + + treeRenderer->DecRef(); +} + void GridAccount::OnOperationModified(wxGridEvent& event) { User* user = _kiss->GetUser(); @@ -638,6 +691,38 @@ void GridAccount::OnOperationModified(wxGridEvent& event) SET_ROW_COLOR(row, color, user->GetCategory(new_op.category).forecolor); SET_ROW_FONT(row, user->GetCategoryFont(new_op.category)); + + if (col == CHECKED) + { + cur_op.checked = new_op.checked; + UpdateOperation(cur_op); + inModification = false; + if (cur_op.meta) + CheckMeta(cur_op, row, cur_op.checked); + else + { + if (cur_op.parent.Length()) + { + op2 = GetOperation(cur_op.parent); + UpdateMeta(op2); + int row2 = GetDisplayedRow(op2.id); + SetCellValue(row2, CHECKED, op2.checked ? wxT("1") : wxT("0")); + + color = user->GetCategory(op2.category).backcolor; + + if (op2.checked) + { + r = ((color.Red()*1.5) >= 0xFF) ? 0xFF : color.Red()*1.5 ; + g = ((color.Green()*1.5) >= 0xFF) ? 0xFF : color.Green()*1.5 ; + b = ((color.Blue()*1.5) >= 0xFF) ? 0xFF : color.Blue()*1.5 ; + color.Set(r, g, b, color.Alpha()); + } + + SET_ROW_COLOR(row2, color, user->GetCategory(op2.category).forecolor); + } + } + return; + } } if (col == DELETE) @@ -688,11 +773,11 @@ void GridAccount::OnOperationModified(wxGridEvent& event) DeleteOperation(cur_op); _displayedOperations.erase(_displayedOperations.begin()+row); _fixCosts--; - _kiss->UpdateOperation(new_op); + UpdateOperation(new_op); } else { - _kiss->UpdateOperation(new_op); + UpdateOperation(new_op); (_displayedOperations)[row] = new_op; } @@ -758,11 +843,11 @@ void GridAccount::OnOperationModified(wxGridEvent& event) DeleteRows(row, 1); DeleteOperation(cur_op); _displayedOperations.erase(_displayedOperations.begin()+row); - _kiss->UpdateOperation(new_op); + UpdateOperation(new_op); } else { - _kiss->UpdateOperation(new_op); + UpdateOperation(new_op); (_displayedOperations)[row] = new_op; } } @@ -796,15 +881,6 @@ void GridAccount::OnOperationModified(wxGridEvent& event) inModification = false ; - if (!need_insertion && (col == CHECKED || col == CATEGORY) && new_op.parent.Length()) - { - op2 = GetOperation(new_op.parent); - UpdateMeta(op2); - int row2 = GetDisplayedRow(op2.id); - wxGridEvent event2(-1, 0, NULL, row2, CATEGORY); - OnOperationModified(event2); - } - event.Skip(); } @@ -851,7 +927,7 @@ void GridAccount::UpdateMeta(Operation& op) if (updateCat) op.category = category; - _kiss->UpdateOperation(op); + UpdateOperation(op); } void GridAccount::Group() @@ -996,7 +1072,7 @@ void GridAccount::Group() op.childs.insert(op.childs.begin()+i, it2->id); it2->parent = op.id; - _kiss->UpdateOperation(*it2); + UpdateOperation(*it2); } UpdateMeta(op); diff --git a/src/view/grid/GridAccount.h b/src/view/grid/GridAccount.h index 974287c..118a59b 100644 --- a/src/view/grid/GridAccount.h +++ b/src/view/grid/GridAccount.h @@ -70,8 +70,10 @@ private: void DeleteOperation(const Operation& op); void UpdateMeta(Operation& op); void RemoveMeta(Operation& op, int line, bool removeRoot, bool deleteOp); + void CheckMeta(Operation& op, int line, bool check); Operation& GetOperation(const wxString& id); + void UpdateOperation(Operation& op); int GetDisplayedRow(const wxString& id); DECLARE_EVENT_TABLE();