#include "StarConfirmationDialog.hpp" #include "StarGuiReader.hpp" #include "StarRoot.hpp" #include "StarLabelWidget.hpp" #include "StarButtonWidget.hpp" #include "StarImageWidget.hpp" #include "StarRandom.hpp" #include "StarAssets.hpp" namespace Star { ConfirmationDialog::ConfirmationDialog() {} void ConfirmationDialog::displayConfirmation(Json const& dialogConfig, RpcPromiseKeeper resultPromise) { m_resultPromise = resultPromise; displayConfirmation(dialogConfig, [this] (Widget*) { m_resultPromise->fulfill(true); }, [this] (Widget*) { m_resultPromise->fulfill(false); } ); } void ConfirmationDialog::displayConfirmation(Json const& dialogConfig, WidgetCallbackFunc okCallback, WidgetCallbackFunc cancelCallback) { Json config; if (dialogConfig.isType(Json::Type::String)) config = Root::singleton().assets()->json(dialogConfig.toString()); else config = dialogConfig; auto assets = Root::singleton().assets(); removeAllChildren(); GuiReader reader; m_okCallback = std::move(okCallback); m_cancelCallback = std::move(cancelCallback); reader.registerCallback("close", bind(&ConfirmationDialog::dismiss, this)); reader.registerCallback("cancel", bind(&ConfirmationDialog::dismiss, this)); reader.registerCallback("ok", bind(&ConfirmationDialog::ok, this)); m_confirmed = false; String paneLayoutPath = config.optString("paneLayout").value("/interface/windowconfig/confirmation.config:paneLayout"); reader.construct(assets->json(paneLayoutPath), this); ImageWidgetPtr titleIcon = {}; if (config.contains("icon")) titleIcon = make_shared(config.getString("icon")); setTitle(titleIcon, config.getString("title", ""), config.getString("subtitle", "")); fetchChild("message")->setText(config.getString("message")); if (config.contains("okCaption")) fetchChild("ok")->setText(config.getString("okCaption")); if (config.contains("cancelCaption")) fetchChild("cancel")->setText(config.getString("cancelCaption")); m_sourceEntityId = config.optInt("sourceEntityId"); for (auto image : config.optObject("images").value({})) { auto widget = fetchChild(image.first); if (image.second.isType(Json::Type::String)) widget->setImage(image.second.toString()); else widget->setDrawables(image.second.toArray().transformed(construct())); } for (auto label : config.optObject("labels").value({})) { auto widget = fetchChild(label.first); widget->setText(label.second.toString()); } show(); auto sound = Random::randValueFrom(Root::singleton().assets()->json("/interface/windowconfig/confirmation.config:onShowSound").toArray(), "").toString(); if (!sound.empty()) context()->playAudio(sound); } Maybe ConfirmationDialog::sourceEntityId() { return m_sourceEntityId; } void ConfirmationDialog::dismissed() { if (!m_confirmed) m_cancelCallback(this); Pane::dismissed(); } void ConfirmationDialog::ok() { m_okCallback(this); m_confirmed = true; dismiss(); } }