Make UI_DIALOG inherit from window

This commit is contained in:
Kp 2020-09-21 03:18:12 +00:00
parent 3c1c270643
commit 8760387188
2 changed files with 30 additions and 38 deletions

View file

@ -214,7 +214,7 @@ enum dialog_flags
template <typename T>
using ui_subfunction_t = window_event_result (*)(struct UI_DIALOG *,const d_event &, T *);
struct UI_DIALOG : embed_window_pointer_t
struct UI_DIALOG : window
{
// TODO: Make these private
ui_subfunction_t<void> d_callback;
@ -227,9 +227,10 @@ struct UI_DIALOG : embed_window_pointer_t
public:
// For creating the dialog, there are two ways - using the (older) ui_create_dialog function
// or using the constructor, passing an event handler that takes a subclass of UI_DIALOG.
explicit UI_DIALOG(short x, short y, short w, short h, enum dialog_flags flags, ui_subfunction_t<void> callback, void *userdata, const void *createdata);
explicit UI_DIALOG(short x, short y, short w, short h, enum dialog_flags flags, ui_subfunction_t<void> callback, void *userdata);
~UI_DIALOG();
virtual window_event_result event_handler(const d_event &) override;
};
#define B1_JUST_PRESSED (event.type == EVENT_MOUSE_BUTTON_DOWN && event_mouse_get_button(event) == 0)
@ -264,7 +265,9 @@ constexpr unused_ui_userdata_t *unused_ui_userdata = nullptr;
template <typename T1, typename T2 = const void>
UI_DIALOG * ui_create_dialog(const short x, const short y, const short w, const short h, const enum dialog_flags flags, const ui_subfunction_t<T1> callback, T1 *const userdata, T2 *const createdata = nullptr)
{
return new UI_DIALOG(x, y, w, h, flags, reinterpret_cast<ui_subfunction_t<void>>(callback), static_cast<void *>(userdata), static_cast<const void *>(createdata));
auto r = std::make_unique<UI_DIALOG>(x, y, w, h, flags, reinterpret_cast<ui_subfunction_t<void>>(callback), static_cast<void *>(userdata));
r->send_creation_events(createdata);
return r.release();
}
template <typename T1, typename T2 = const void>

View file

@ -62,7 +62,7 @@ static void ui_dialog_draw(UI_DIALOG *dlg)
// The dialog handler borrows heavily from the newmenu_handler
static window_event_result ui_dialog_handler(window *wind,const d_event &event, UI_DIALOG *dlg)
window_event_result UI_DIALOG::event_handler(const d_event &event)
{
window_event_result rval{window_event_result::ignored};
@ -70,8 +70,8 @@ static window_event_result ui_dialog_handler(window *wind,const d_event &event,
event.type == EVENT_WINDOW_DEACTIVATED)
return window_event_result::ignored;
if (dlg->d_callback)
if ((rval = (*dlg->d_callback)(dlg, event, dlg->d_userdata)) != window_event_result::ignored)
if (d_callback)
if ((rval = (*d_callback)(this, event, d_userdata)) != window_event_result::ignored)
return rval; // event handled
switch (event.type)
@ -84,66 +84,55 @@ static window_event_result ui_dialog_handler(window *wind,const d_event &event,
case EVENT_MOUSE_MOVED:
case EVENT_KEY_COMMAND:
case EVENT_KEY_RELEASE:
return ui_dialog_do_gadgets(dlg, event);
return ui_dialog_do_gadgets(this, event);
case EVENT_WINDOW_DRAW:
{
ui_dialog_draw(dlg);
rval = ui_dialog_do_gadgets(dlg, event);
ui_dialog_draw(this);
rval = ui_dialog_do_gadgets(this, event);
if (rval != window_event_result::close)
{
d_event event2 = { EVENT_UI_DIALOG_DRAW };
window_send_event(*wind, event2);
window_send_event(*this, event2);
}
return rval;
}
case EVENT_WINDOW_CLOSE:
if (rval != window_event_result::deleted) // check if handler already deleted dialog (e.g. if UI_DIALOG was subclassed)
delete dlg;
return window_event_result::ignored; // free the window in any case (until UI_DIALOG is subclass of window)
delete this;
return window_event_result::deleted; // free the window in any case (until UI_DIALOG is subclass of window)
default:
return window_event_result::ignored;
}
}
UI_DIALOG::UI_DIALOG(short x, short y, const short w, const short h, const enum dialog_flags flags, const ui_subfunction_t<void> callback, void *const userdata, const void *const createdata) :
static short adjust_starting_coordinate(short value, const int limit)
{
if (value < 0)
value = 0;
if (value - 1 >= limit)
value = limit;
return value;
}
UI_DIALOG::UI_DIALOG(short x, short y, const short w, const short h, const enum dialog_flags flags, const ui_subfunction_t<void> callback, void *const userdata) :
window(grd_curscreen->sc_canvas, adjust_starting_coordinate(x, grd_curscreen->get_screen_width() - w), adjust_starting_coordinate(y, grd_curscreen->get_screen_height() - h), w, h),
d_callback(callback), d_userdata(userdata), d_width(w), d_height(h), d_flags(flags)
{
int sw, sh, req_w, req_h;
auto dlg = this;
sw = grd_curscreen->get_screen_width();
sh = grd_curscreen->get_screen_height();
//mouse_set_limits(0, 0, sw - 1, sh - 1);
req_w = w;
req_h = h;
if ( x < 0 ) x = 0;
if ( (x+w-1) >= sw ) x = sw - w;
if ( y < 0 ) y = 0;
if ( (y+h-1) >= sh ) y = sh - h;
selected_gadget = NULL;
dlg->wind = window_create(grd_curscreen->sc_canvas,
x,
y,
req_w, req_h, ui_dialog_handler, dlg, createdata);
if (!(flags & DF_MODAL))
dlg->wind->set_modal(0); // make this window modeless, allowing events to propogate through the window stack
set_modal(0); // make this window modeless, allowing events to propogate through the window stack
}
window *ui_dialog_get_window(UI_DIALOG *dlg)
{
return dlg->wind;
return dlg;
}
void ui_dialog_set_current_canvas(UI_DIALOG *dlg)
{
gr_set_current_canvas(dlg->wind->w_canv);
gr_set_current_canvas(dlg->w_canv);
}
UI_DIALOG::~UI_DIALOG()
@ -153,7 +142,7 @@ UI_DIALOG::~UI_DIALOG()
void ui_close_dialog( UI_DIALOG * dlg )
{
window_close(dlg->wind);
window_close(dlg);
}
#if 0