From 6352e8e3196f78388b6c771073f9e03eaa612673 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:33:09 +1000 Subject: everything everywhere all at once --- source/frontend/StarConfirmationDialog.cpp | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 source/frontend/StarConfirmationDialog.cpp (limited to 'source/frontend/StarConfirmationDialog.cpp') diff --git a/source/frontend/StarConfirmationDialog.cpp b/source/frontend/StarConfirmationDialog.cpp new file mode 100644 index 0000000..0fdad09 --- /dev/null +++ b/source/frontend/StarConfirmationDialog.cpp @@ -0,0 +1,96 @@ +#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 = move(okCallback); + m_cancelCallback = 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(); +} + +} -- cgit v1.2.3