载入中...
搜索中...
未找到
PcgPhotoModeRuntimeUI.cpp
浏览该文件的文档.
3#include <simplesquirrel/simplesquirrel.hpp>
4#include <algorithm>
5#include <cmath>
6#include <locale>
7#include <sstream>
8
9namespace eve::ui {
10
11
12Result<void> PcgPhotoModeRuntimeUI::configure(int rawKind, const std::string &name, const std::string &text,
13 float value, float minimum, float maximum, bool imageFound) {
14 if (rawKind < 0 || rawKind > 13) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "photo-mode widget kind must be in range 0..13", {}, {}, "ui.pcgPhotoModeRuntimeUI"));
15 if (!std::isfinite(value) || !std::isfinite(minimum) || !std::isfinite(maximum) || minimum > maximum)
16 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "photo-mode slider values must be finite and minimum must not exceed maximum", {}, {}, "ui.pcgPhotoModeRuntimeUI"));
17 kind_ = static_cast<PcgPhotoModeWidgetKind>(rawKind); name_ = name; valueText_ = text;
18 value_ = value; minimum_ = minimum; maximum_ = maximum;
20 isUsingSlider_ = true; inputRefresh_ = false;
21 labelVisible_ = secondLabelVisible_ = sliderVisible_ = inputVisible_ = false;
22 toggleVisible_ = buttonVisible_ = dropdownVisible_ = imageVisible_ = false;
23 headerVisible_ = colorVisible_ = vector2Visible_ = vector3Visible_ = false;
24 switch (kind_) {
25 case PcgPhotoModeWidgetKind::Field: labelVisible_ = inputVisible_ = true; break;
26 case PcgPhotoModeWidgetKind::Slider: case PcgPhotoModeWidgetKind::IntSlider: labelVisible_ = sliderVisible_ = inputVisible_ = true; break;
27 case PcgPhotoModeWidgetKind::DisplaySlider: case PcgPhotoModeWidgetKind::DisplayIntSlider: labelVisible_ = secondLabelVisible_ = sliderVisible_ = true; break;
28 case PcgPhotoModeWidgetKind::Toggle: labelVisible_ = toggleVisible_ = true; break;
29 case PcgPhotoModeWidgetKind::Header: headerVisible_ = true; break;
30 case PcgPhotoModeWidgetKind::Dropdown: labelVisible_ = dropdownVisible_ = true; break;
31 case PcgPhotoModeWidgetKind::Label: labelVisible_ = secondLabelVisible_ = true; break;
32 case PcgPhotoModeWidgetKind::Button: labelVisible_ = buttonVisible_ = true; break;
33 case PcgPhotoModeWidgetKind::Color: labelVisible_ = colorVisible_ = true; break;
34 case PcgPhotoModeWidgetKind::BannerImage: imageVisible_ = imageFound; break;
35 case PcgPhotoModeWidgetKind::Vector2: labelVisible_ = vector2Visible_ = true; break;
36 case PcgPhotoModeWidgetKind::Vector3: labelVisible_ = vector3Visible_ = true; break;
37 }
38 if (kind_ == PcgPhotoModeWidgetKind::Field || (rawKind >= 1 && rawKind <= 5) ||
40 ++initialCallbackRevision_;
41 return Result<void>::success();
42}
43
45 if (!std::isfinite(value)) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "photo-mode slider value must be finite", {}, {}, "ui.pcgPhotoModeRuntimeUI"));
46 value_ = value; inputRefresh_ = isUsingSlider_;
47 if (inputRefresh_) { std::ostringstream s; s.imbue(std::locale::classic()); s << value; valueText_ = s.str(); }
48 isUsingSlider_ = false; return Result<void>::success();
49}
50
52 std::istringstream s(text.empty() ? "0" : text); s.imbue(std::locale::classic()); float parsed = 0.0f;
53 s >> parsed; if (s.fail() || !std::isfinite(parsed)) return PcgPhotoModeInputStatus::Ignored;
54 s >> std::ws; if (!s.eof()) return PcgPhotoModeInputStatus::Ignored;
55 if (parsed < minimum_ || parsed > maximum_) isUsingSlider_ = true;
56 value_ = std::clamp(parsed, minimum_, maximum_); return PcgPhotoModeInputStatus::Applied;
57}
58
59std::string PcgPhotoModeRuntimeUI::updateWrap(const std::string &text) {
60 constexpr size_t wrap = 68; int sanity = 9000; std::string result; size_t p = 0;
61 while (p < text.size() && --sanity > 0) {
62 if (p + wrap >= text.size()) { result.append(text.substr(p)); break; }
63 size_t edit = text.rfind(' ', p + wrap);
64 if (edit == std::string::npos || edit <= p) edit = p + wrap;
65 result.append(text.substr(p, edit - p)); result.push_back('\n'); p = edit + 1;
66 }
67 return result;
68}
69
70void exposePcgPhotoModeRuntimeUIBindings(ssq::Table &table) {
71 auto vm = table.getHandle(); auto c = table.addClass("PcgPhotoModeRuntimeUI", ssq::Class::Ctor<PcgPhotoModeRuntimeUI()>());
72 c.addFunc("configure", [vm](PcgPhotoModeRuntimeUI *s, int k, const std::string &n, const std::string &t, float v, float lo, float hi, bool found) { return eve::script::projectResult(vm, s->configure(k, n, t, v, lo, hi, found)); });
73 c.addFunc("markSliderUsed", [](PcgPhotoModeRuntimeUI *s, bool v) { s->markSliderUsed(v); });
74 c.addFunc("setSliderValue", [vm](PcgPhotoModeRuntimeUI *s, float v) { return eve::script::projectResult(vm, s->setSliderValue(v)); });
75 c.addFunc("applyFloatInput", [](PcgPhotoModeRuntimeUI *s, const std::string &v) { return s->applyFloatInput(v) == PcgPhotoModeInputStatus::Applied; });
76 c.addFunc("updateWrap", [](PcgPhotoModeRuntimeUI *, const std::string &v) { return PcgPhotoModeRuntimeUI::updateWrap(v); });
77 c.addFunc("getKind", [](const PcgPhotoModeRuntimeUI* s){ return s->getKind(); });
78 c.addFunc("getName", [](const PcgPhotoModeRuntimeUI* s){ return s->getName(); });
79 c.addFunc("getValueText", [](const PcgPhotoModeRuntimeUI* s){ return s->getValueText(); });
80 c.addFunc("getValue", [](const PcgPhotoModeRuntimeUI* s){ return s->getValue(); });
81 c.addFunc("getMinimum", [](const PcgPhotoModeRuntimeUI* s){ return s->getMinimum(); });
82 c.addFunc("getMaximum", [](const PcgPhotoModeRuntimeUI* s){ return s->getMaximum(); });
83 c.addFunc("getWholeNumbers", [](const PcgPhotoModeRuntimeUI* s){ return s->getWholeNumbers(); });
84 c.addFunc("getUsingSlider", [](const PcgPhotoModeRuntimeUI* s){ return s->getUsingSlider(); });
85 c.addFunc("getInputRefresh", [](const PcgPhotoModeRuntimeUI* s){ return s->getInputRefresh(); });
86 c.addFunc("getLabelVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getLabelVisible(); });
87 c.addFunc("getSecondLabelVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getSecondLabelVisible(); });
88 c.addFunc("getSliderVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getSliderVisible(); });
89 c.addFunc("getInputVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getInputVisible(); });
90 c.addFunc("getToggleVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getToggleVisible(); });
91 c.addFunc("getButtonVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getButtonVisible(); });
92 c.addFunc("getDropdownVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getDropdownVisible(); });
93 c.addFunc("getImageVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getImageVisible(); });
94 c.addFunc("getHeaderVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getHeaderVisible(); });
95 c.addFunc("getColorVisible", [](const PcgPhotoModeRuntimeUI* s){ return s->getColorVisible(); });
96 c.addFunc("getVector2Visible", [](const PcgPhotoModeRuntimeUI* s){ return s->getVector2Visible(); });
97 c.addFunc("getVector3Visible", [](const PcgPhotoModeRuntimeUI* s){ return s->getVector3Visible(); });
98 c.addFunc("getInitialCallbackRevision", [](const PcgPhotoModeRuntimeUI* s){ return s->getInitialCallbackRevision(); });
99}
100} // namespace eve::ui
double value
const std::string & s
glm::vec4 p[6]
HSQUIRRELVM vm
Definition ECS.cpp:20
float maximum[3]
float minimum[3]
glm::vec3 n
Definition Grass.cpp:63
float v
std::int32_t c
std::string text
std::string name
float t
bool found
The single Squirrel projection for common Result, Status and Value.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Backend-neutral state of one Pcg PhotoModeUIHelper prefab instance.
Result< void > setSliderValue(float value)
Apply a slider value and consume the input synchronization flag.
PcgPhotoModeInputStatus applyFloatInput(const std::string &value) noexcept
Parse, clamp, and apply text using Pcg GetAndSetFloatValue semantics.
static std::string updateWrap(const std::string &value)
Wrap metrics text with Pcg's exact 68-column algorithm.
Result< void > configure(int kind, const std::string &name, const std::string &value, float sliderValue, float minimum, float maximum, bool bannerImageFound=true)
Configure one widget family and publish its initial callback revision.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
PcgPhotoModeWidgetKind
Widget families created by Pcg PhotoModeUtils.
void exposePcgPhotoModeRuntimeUIBindings(ssq::Table &table)
Register Pcg photo-mode runtime UI bindings.
PcgPhotoModeInputStatus
Result of parsing one Pcg photo-mode numeric input field.