Several fixes to get the state flags to appear right in "print".

This commit is contained in:
John Wiegley 2009-02-07 23:30:40 -04:00
parent 6f37d88391
commit ffba456113
4 changed files with 24 additions and 14 deletions

View file

@ -61,14 +61,14 @@ entry_base_t::~entry_base_t()
item_t::state_t entry_base_t::state() const
{
bool first = true;
state_t result = UNCLEARED;
state_t result = CLEARED;
foreach (xact_t * xact, xacts) {
if ((result == UNCLEARED && xact->_state != UNCLEARED) ||
(result == PENDING && xact->_state == CLEARED))
result = xact->_state;
if (xact->_state == UNCLEARED)
return UNCLEARED;
else if (xact->_state == PENDING)
result = PENDING;
}
return result;
}

View file

@ -58,11 +58,13 @@ report_t::report_t(session_t& _session) : session(_session)
"%48|%-.38A %22.108t %!22.132T\n");
HANDLER(print_format_).on(
"%(entry.date)%(entry.cleared ? \" *\" : (entry.uncleared ? \"\" : \" !\"))"
"%(entry.date)%(entry.cleared ? \" *\" : (entry.pending ? \" !\" : \"\"))"
"%(code ? \" (\" + code + \")\" : \"\") %(payee)%(entry.comment | \"\")\n"
" %(cleared ? \"* \" : (uncleared ? \"\" : \"! \"))%-34(account)"
" %(entry.uncleared ? (cleared ? \"* \" : (pending ? \"! \" : \"\")) : \"\")"
"%-34(account)"
" %12(amount)%(comment | \"\")\n%/"
" %(cleared ? \"* \" : (uncleared ? \"\" : \"! \"))%-34(account)"
" %(entry.uncleared ? (cleared ? \"* \" : (pending ? \"! \" : \"\")) : \"\")"
"%-34(account)"
" %12(amount)%(comment | \"\")\n%/\n");
HANDLER(balance_format_).on(
@ -84,7 +86,7 @@ report_t::report_t(session_t& _session) : session(_session)
"%(quoted(payee)),"
"%(quoted(account)),"
"%(quoted(display_amount)),"
"%(quoted(cleared ? \"*\" : (uncleared ? \"\" : \"!\"))),"
"%(quoted((cleared or entry.cleared) ? \"*\" : ((pending or entry.pending) ? \"!\" : \"\"))),"
"%(quoted(code)),"
"%(quoted(join(note)))\n");
}

View file

@ -752,8 +752,8 @@ xact_t * instance_t::parse_xact(char * line,
}
if (entry &&
((entry->_state == item_t::CLEARED && xact->state() != item_t::CLEARED) ||
(entry->_state == item_t::PENDING && xact->state() == item_t::UNCLEARED)))
((entry->_state == item_t::CLEARED && xact->_state != item_t::CLEARED) ||
(entry->_state == item_t::PENDING && xact->_state == item_t::UNCLEARED)))
xact->set_state(entry->_state);
// Parse the account name
@ -1050,15 +1050,14 @@ entry_t * instance_t::parse_entry(char * line,
// Parse the optional cleared flag: *
item_t::state_t state = item_t::UNCLEARED;
if (next) {
switch (*next) {
case '*':
state = item_t::CLEARED;
curr->_state = item_t::CLEARED;
next = skip_ws(++next);
break;
case '!':
state = item_t::PENDING;
curr->_state = item_t::PENDING;
next = skip_ws(++next);
break;
}

View file

@ -66,6 +66,10 @@ item_t::state_t xact_t::state() const
}
namespace {
value_t get_this(xact_t& xact) {
return value_t(static_cast<scope_t *>(&xact));
}
value_t get_entry(xact_t& xact) {
return value_t(static_cast<scope_t *>(xact.entry));
}
@ -198,6 +202,11 @@ expr_t::ptr_op_t xact_t::lookup(const string& name)
else if (name == "total_cost")
return WRAP_FUNCTOR(get_wrapper<&get_total_cost>);
break;
case 'x':
if (name == "xact")
return WRAP_FUNCTOR(get_wrapper<&get_this>);
break;
}
return item_t::lookup(name);