I have a design question about (i guess) object interdependence
using gtkd.
There is an application class which sets its property mAppWin.
The app is passed as an argument to the window constructor.
During the window constructor a scale (trackbar) is created which
also receives and stores an app reference to later update other
elements during an onChange event. The scale can access
mApp.mSomeData to set its initial value because app has been
passed down. The call to setValue() now triggers onValueChanged()
which wants to access the mAppWin property of the app to update a
canvas. Since all this happens during the initial 'new AppWin()'
call in App, the app's mAppWin property is not set yet, so
onValueChanged() will crash.
class App : Application
{
AppWin mAppWin;
void onActivate(GioApplication gioApp)
{
mSomeData = 123;
mAppWin = new AppWin(app, [...]);
class AppWin : ApplicationWindow
{
Scale1 mScale1;
this(Application application, [...])
{
mScale1 = new Scale1(0, 100, 1, app); // (app is application
casted)
class Scale1 : VScale
{
App mApp;
this([...], App app)
{
[...]
mApp = app;
[...]
setValue(max * mApp.mSomeData);
}
void onValueChanged(Range range)
{
//if (mApp.mAppWin)
mApp.mAppWin.mCanvas.update(); // mAppWin not set
yet, 0
I have several question in mind:
- Is it a bad idea to pass an app around that contains everything
for everywhere?
- Should the app pass the data for the initial scale value
through the window constructor? Or should it set the scale value
after initialization is done?
- How would the scale update the canvas without keeping/walking
through a DOM like this. Maybe some asynchronous messaging?
While I could make it work, I wonder what the actual problem is
and what it's called like.