61 lines
1.9 KiB
C++
61 lines
1.9 KiB
C++
//
|
|
// Created by selim on 17.05.2022.
|
|
//
|
|
|
|
#include "Dialog.h"
|
|
|
|
namespace gtkpp {
|
|
|
|
void responseCallback(GtkDialog*, GtkResponseType responseId, void* data) {
|
|
auto dialog = reinterpret_cast<Dialog*>(data);
|
|
dialog->_response = responseId;
|
|
dialog->_signalResponse.emit(responseId);
|
|
}
|
|
|
|
Dialog::Dialog(Window* parent) {
|
|
|
|
auto flags = static_cast<GtkDialogFlags>(GTK_DIALOG_DESTROY_WITH_PARENT
|
|
| GTK_DIALOG_MODAL
|
|
| GTK_DIALOG_USE_HEADER_BAR);
|
|
|
|
auto dialog = gtk_dialog_new_with_buttons("Add plate number",
|
|
parent->gobj(),
|
|
flags,
|
|
"OK", GTK_RESPONSE_OK,
|
|
"Cancel", GTK_RESPONSE_CANCEL,
|
|
nullptr);
|
|
_window = GTK_WINDOW(dialog);
|
|
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
|
|
_responseHandlerId = g_signal_connect (dialog, "response", G_CALLBACK(responseCallback), this);
|
|
}
|
|
|
|
void Dialog::onResponse(const std::function<void(GtkResponseType)> &callback) {
|
|
_signalResponse.connect(callback);
|
|
}
|
|
|
|
cc::result<GtkResponseType> Dialog::responseAsync() {
|
|
auto promise = std::make_shared<cc::result_promise<GtkResponseType>>();
|
|
auto result = promise->get_result();
|
|
|
|
_signalResponse.connect([promise](GtkResponseType response){
|
|
promise->set_result(response);
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
Dialog::~Dialog() {
|
|
g_signal_handler_disconnect(_window, _responseHandlerId);
|
|
}
|
|
|
|
GtkResponseType Dialog::currentResponse() const {
|
|
return _response;
|
|
}
|
|
|
|
Box Dialog::contentWidget() const {
|
|
auto contentArea = gtk_dialog_get_content_area (GTK_DIALOG(_window));
|
|
return {contentArea};
|
|
}
|
|
|
|
}
|