AutoCatGnome/gtkpp/Dialog.cpp

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};
}
}