Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/frontend/StarConfirmationDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/frontend/StarConfirmationDialog.cpp')
-rw-r--r--source/frontend/StarConfirmationDialog.cpp96
1 files changed, 96 insertions, 0 deletions
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<Json> 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<ImageWidget>(config.getString("icon"));
+
+ setTitle(titleIcon, config.getString("title", ""), config.getString("subtitle", ""));
+ fetchChild<LabelWidget>("message")->setText(config.getString("message"));
+
+ if (config.contains("okCaption"))
+ fetchChild<ButtonWidget>("ok")->setText(config.getString("okCaption"));
+ if (config.contains("cancelCaption"))
+ fetchChild<ButtonWidget>("cancel")->setText(config.getString("cancelCaption"));
+
+ m_sourceEntityId = config.optInt("sourceEntityId");
+
+ for (auto image : config.optObject("images").value({})) {
+ auto widget = fetchChild<ImageWidget>(image.first);
+ if (image.second.isType(Json::Type::String))
+ widget->setImage(image.second.toString());
+ else
+ widget->setDrawables(image.second.toArray().transformed(construct<Drawable>()));
+ }
+
+ for (auto label : config.optObject("labels").value({})) {
+ auto widget = fetchChild<LabelWidget>(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<EntityId> 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();
+}
+
+}