Removing Modal Loops


Having throughly blasted my foot with bullets I'm removing all the modal loops from an application. 

There's a scenario I'm still scratching my head about though.  In the code below if the object I'm calling the AlertWindow from is deleted before the user pushes a button on the dialog, what's the tidiest way of ensuring the callback doesn't crash (as devices will have been deleted).  Do I need to use WeakReference here, or is there a less verbose solution I've missed?

I guess I could extend my ModalCallbackAction class to take a WeakReference to the originating object and then not call the lambda at all - which is a relatively nice solution.

    auto callback = [this, deviceId](int r)
        if (r == 1)
            auto newDevice = devices.createNewObject();

    AlertWindow::showOkCancelBox(AlertWindow::QuestionIcon, "Attach Device", "Attach?", "Yes", "No", nullptr, new ModalCallbackAction(callback)); 


class ModalCallbackAction
    public ModalComponentManager::Callback
    ModalCallbackAction(std::function<void(int)> actionToRun)
    void modalStateFinished(int resultCode) override
    std::function<void(int)> action;


Try ModalCallbackFunction::forComponent - it'll manage the WeakReference for you so that it handles the deletion of the Component safely.


Ta!  WeakReference it is then ... :)  Unfortunately not always using this from a Component object so I've had to roll my own.  



Interesting example. I am also just looking into modal dialogs.