* Improve check/uncheck on grouped operations

This commit is contained in:
Grégory Soutadé 2010-10-04 22:10:21 +02:00
parent 340a53094d
commit 8ff39c01e9
2 changed files with 94 additions and 16 deletions

View File

@ -140,6 +140,19 @@ Operation& GridAccount::GetOperation(const wxString& id)
return *it;
}
void GridAccount::UpdateOperation(Operation& op)
{
std::vector<Operation>::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<Operation*>::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<Operation*>::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);

View File

@ -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();