On 30-06-13 10:38, Herbert Thoma wrote:
Am 29.06.2013 17:38, schrieb Geert Janssens:
On 29-06-13 16:52, John Ralls wrote:
<...>
Just for clarity, the definitions of report-template and report are purely in 
guile code (src/reports/report-system/report.scm).
Our c code is totally unaware of this. It just passes around opaque SCM 
objects. I don't even know where the html page appears
in this picture. It's not in this part of the code yet. A "report" in 
report.scm is defined as a record containing a report-type (which is the guid of a base 
report template), a report-id (just a number), a structure holding the report options, a 
reference to the editor widget and some housekeeping flags.
Where I'm going with this is that if a report is if a Report is open it will 
just sit there until the user tries to reload it
(which would include loading a Book with an open report). If the ReportTemplate 
is changed, the Report gets re-created based
on the new ReportTemplate, right? If the ReportTemplate is gone, which is currently 
possible if one deletes a "custom report" in
the dialog box, I would hope that Gnucash displays a nice "Can't find the 
Report" in the HTML page rather than crashing.
This doesn't happen, because the custom report's template id is never stored in 
a report record. Instead the base template on
which the custom report template is based on is stored in the report record. So 
when you reopen a report (by reopening a book),
the report currently doesn't even know it ever was instantiated from a custom 
report. It will reinstantiate from the base template.
I believe this was originally done exactly to prevent unexpected crashes when 
the custom template got deleted.

This results in a two-level template hierarchy. The base templates are all the 
report definitions that ship with gnucash, or that
a user loads manually (what I would consider a true "custom report"). What is 
called custom reports now are the reports a user can
save from within the program. Which really aren't much more than a reference to 
a base report and a custom set of default options.
The code keeps this hierarchy shallow. There will never be a custom template 
based on another custom template. Which I think is
good exactly to avoid the template is deleted issue.

But I needed to keep track of which custom template a report is instantiated 
from, so I have now added an extra parameter in the
report record to keep track of which custom report was optionally instantiated 
when the report was generated. I'm still keeping
this parameter separately from the "report-type" which will always hold the 
core template to prevent the crashes you describe.
My question here is: Why do we need an intermediate custom template at all?
It wasn't needed until now.

This is what has changed: the new user interaction will allow you to do this sequence:
- open a report based on a custom template
- make some changes in the options
- hit save -> this will update the custom template the report was based on

For this last step, you need to keep track of which custom template (if any) a report is based on.

If a custom report template is a core template with a set of options, a new 
custom template
should be a core template with a set of options as well.
It is.
  Why do we need the reference to the old
custom template for the new custom template? What am I missing?
See above.
  Do changes of options in
the parent custom template affect the child custom template? If yes, how can a 
user see such
dependencies? Would we even want such a behaviour?
Custom templates are never based on other custom templates. Only a report can be instantiated from a custom template. So there is no custom template hierarchy. As for instantiated reports (or "open" reports if you like), they won't change if their custom template changes. A custom template is only relevant to open a fresh report based on it. At that point all options are copied from the template to the new report. Any changes later on in the custom template will not be propagated to already open reports.

BTW: The whole report logic is too much on the scheme side, IMHO. A while back 
I tried to
implement a "refresh all reports" feature (I have a number of reports open and 
right now the most
convenient way to refresh them all is to close GnuCash and start it up again 
...). I gave up
on the "refresh all reports" feature, because I could not even find the proper 
place for the
for all open reports loop. I could not find a list of open reports in the C 
side code so I
concluded it must be on the Scheme side, but my scheme-foo was to low :-(
I agree. The report system is almost purely written in scheme. The only parts that touch C are the parts that integrate the whole report logic into the GUI.

Unfortunately that's how it is currently. I would take way more time than I have available in the short term to change this, though it is one of my long term ideas.

Geert
_______________________________________________
gnucash-devel mailing list
[email protected]
https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to