Removing Modal Loops


#1

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();
            newDevice->setUniqueDeviceId(deviceId);
            newDevice->setConnected(true);
            listeners.call(&Listener::deviceListChanged);
        }
    };

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

Where: 


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

#2

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


#3

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

 


#4

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