Custom dialogs

Standard dialogs created by create_ok_dialog(), create_ok_cancel_dialog(), and other methods, use a predetermined layout, and content, specified by the current display theme. There are two ways to create a custom dialog. create_dialog() creates a completely empty dialog, using a creator lambda:

#include <x/w/dialog.H>
#include <x/w/gridlayoutmanager.H>

x::w::new_gridlayoutmanager dialog_lm;
x::w::create_dialog_args dialog_config{
    "",    // Dialog identifier
    true,                        // Modal dialog.

// Dialogs default to using the grid layout manager. This is how this default
// can be adjusted:


x::w::dialog d=mw->create_dialog
     (const x::w::dialog &d)
           x::w::gridlayoutmanager lm=d->get_layoutmanager();

           // ...

create_dialog()'s first parameter is the dialog's identifier and other configuration settings. The second parameter is the dialog's creator lambda.

There's also a second, more complicated approach, that allows creating a custom subclass of x::w::dialogObj (x::w::dialog's underlying reference-counted object). This is the mechanism that creates x::w::input_dialogs, summarized as follows:

class custom_dialogObj : public x::w::dialogObj {


    //! Constructor
    custom_dialogObj(const x::w::dialog_args &)
          : x::w::dialogObj(args)
         auto main_window=this->dialog_window;

         // etc...

    //! Destructor

typedef x::ref<custom_dialogObj> custom_dialog;

// ...
auto new_custom_dialog=mw->create_custom_dialog(
     {"", true},
     (const auto &args)
          return custom_dialog::create(args);

create_custom_dialog()'s first parameter is also the dialog identifier and configuration settings. Its second parameter is a callable object that receives a x::w::dialog_args parameter, and returns a a reference to a subclass of a x::w::dialog; create_custom_dialog() returns what the callable object itself returns.

A custom dialog class inherits from x::w::dialogObj, whose constructor takes a reference to the x::w::dialog_args. The custom callable object is typically a lambda that forwards the x::w::dialog_args to the custom dialog class's constructor, together with any other parameters.

The constructor forwards the x::w::dialog_args to its x::w::dialogObj superclass. The custom dialog class's constructor can, at this point, use the dialog_window to create the new dialog's widgets, and to store them into the custom dialog class itself, for easy access. This is how create_input_dialog() assembles a new x::w::input_dialog with its input_dialog_field class member.