Added a confirmation dialog
This commit is contained in:
48
src/ui.cpp
48
src/ui.cpp
@@ -53,9 +53,8 @@ bool setup_data_binding(Rml::Context *context, Rml::DataModelHandle &model_handl
|
||||
// Confirmation dialog
|
||||
dmc.Bind("is_confirmation_dialog_open", &app_data.is_confirmation_dialog_open);
|
||||
dmc.Bind("confirmation_dialog_text", &app_data.confirmation_dialog_text);
|
||||
dmc.Bind("confirmation_dialog_result", &app_data.confimation_dialog_result);
|
||||
|
||||
|
||||
// Submit Add Critter
|
||||
dmc.BindEventCallback("submit_add_critter", [&app_data, &critters, &critter_list](Rml::DataModelHandle handle, Rml::Event &, const Rml::VariantList &) {
|
||||
Critter temp;
|
||||
temp.name = app_data.new_critter_form.name;
|
||||
@@ -91,18 +90,49 @@ bool setup_data_binding(Rml::Context *context, Rml::DataModelHandle &model_handl
|
||||
}
|
||||
});
|
||||
|
||||
dmc.BindEventCallback("delete_critter", [&app_data, &critters, &critter_list](Rml::DataModelHandle handle, Rml::Event &, const Rml::VariantList &args) {
|
||||
// Request Critter Deletion
|
||||
dmc.BindEventCallback("delete_critter", [&app_data, &critters, &critter_list](Rml::DataModelHandle const_handle, Rml::Event &, const Rml::VariantList &args) {
|
||||
if (args.empty()) return;
|
||||
|
||||
Rml::DataModelHandle handle = const_handle;
|
||||
|
||||
int target_id = args[0].Get<int>();
|
||||
|
||||
if (db_delete_critter(target_id)) {
|
||||
critters.erase(target_id);
|
||||
sync_map_to_list(critters, critter_list);
|
||||
handle.DirtyVariable("critters");
|
||||
std::cout << "[INFO] Deleted critter with ID #" << target_id << std::endl;
|
||||
app_data.confirmation_dialog_text = "Are you sure you want to delete critter '" + critters[target_id].name + "'? This action cannot be undone.";
|
||||
|
||||
app_data.on_confirm_action = [&critters, &critter_list, target_id, const_handle]() {
|
||||
Rml::DataModelHandle handle = const_handle;
|
||||
if (db_delete_critter(target_id)) {
|
||||
critters.erase(target_id);
|
||||
sync_map_to_list(critters, critter_list);
|
||||
handle.DirtyVariable("critters");
|
||||
std::cout << "[INFO] Deleted critter with ID #" << target_id << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
app_data.is_confirmation_dialog_open = true;
|
||||
handle.DirtyVariable("confirmation_dialog_text");
|
||||
handle.DirtyVariable("is_confirmation_dialog_open");
|
||||
});
|
||||
|
||||
dmc.BindEventCallback("confirm_dialog_yes", [&app_data](Rml::DataModelHandle const_handle, Rml::Event &, const Rml::VariantList &) {
|
||||
Rml::DataModelHandle handle = const_handle;
|
||||
|
||||
if (app_data.on_confirm_action) {
|
||||
app_data.on_confirm_action();
|
||||
app_data.on_confirm_action = nullptr;
|
||||
}
|
||||
});
|
||||
app_data.is_confirmation_dialog_open = false;
|
||||
handle.DirtyVariable("is_confirmation_dialog_open");
|
||||
});
|
||||
|
||||
dmc.BindEventCallback("confirm_dialog_no", [&app_data](Rml::DataModelHandle const_handle, Rml::Event &, const Rml::VariantList &) {
|
||||
Rml::DataModelHandle handle = const_handle;
|
||||
|
||||
app_data.on_confirm_action = nullptr;
|
||||
app_data.is_confirmation_dialog_open = false;
|
||||
handle.DirtyVariable("is_confirmation_dialog_open");
|
||||
});
|
||||
|
||||
model_handle = dmc.GetModelHandle();
|
||||
return true;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <RmlUi/Config/Config.h>
|
||||
#include <RmlUi/Core/Context.h>
|
||||
#include <RmlUi/Core/DataModelHandle.h>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
@@ -33,6 +34,8 @@ struct AppData {
|
||||
bool confimation_dialog_result = false;
|
||||
Rml::String error_message;
|
||||
NewCritterForm new_critter_form;
|
||||
|
||||
std::function<void()> on_confirm_action = nullptr;
|
||||
};
|
||||
|
||||
void sync_map_to_list(const std::map<int, Critter> &critters, std::vector<CritterEntry> &critter_list);
|
||||
|
||||
Reference in New Issue
Block a user