C++ live-reload: support getting the model back

This commit is contained in:
Olivier Goffart 2025-07-09 09:12:09 +02:00
parent 43b436a89f
commit 01850e0b82
4 changed files with 67 additions and 18 deletions

View file

@ -82,13 +82,9 @@ inline interpreter::Value into_slint_value(const long int &val)
}
template<typename ModelData>
inline std::shared_ptr<slint::Model<ModelData>>
std::shared_ptr<slint::Model<ModelData>>
from_slint_value(const slint::interpreter::Value &,
const std::shared_ptr<slint::Model<ModelData>> *)
{
std::cout << "NOT IMPLEMENTED " << __PRETTY_FUNCTION__ << std::endl;
return {};
}
const std::shared_ptr<slint::Model<ModelData>> *);
template<typename ModelData>
slint::interpreter::Value into_slint_value(const std::shared_ptr<slint::Model<ModelData>> &val);
@ -297,11 +293,28 @@ protected:
return interpreter::Value(cbindgen_private::slint_interpreter_value_new_model(
reinterpret_cast<uint8_t *>(wrapper.get()), vtable()));
}
public:
// get the model wrapper from a value (or nullptr if the value don't contain a model)
static const LiveReloadModelWrapperBase *get(const slint::interpreter::Value &value)
{
if (auto model =
cbindgen_private::slint_interpreter_value_to_model(value.inner, vtable())) {
return reinterpret_cast<const LiveReloadModelWrapperBase *>(model);
} else {
return nullptr;
}
}
};
template<typename ModelData>
class LiveReloadModelWrapper : public LiveReloadModelWrapperBase
{
public:
LiveReloadModelWrapper(std::shared_ptr<slint::Model<ModelData>> model) : model(std::move(model))
{
}
std::shared_ptr<slint::Model<ModelData>> model = nullptr;
int row_count() const override { return model->row_count(); }
@ -319,11 +332,6 @@ class LiveReloadModelWrapper : public LiveReloadModelWrapperBase
model->set_row_data(i, from_slint_value<ModelData>(value));
}
public:
LiveReloadModelWrapper(std::shared_ptr<slint::Model<ModelData>> model) : model(std::move(model))
{
}
static slint::interpreter::Value wrap(std::shared_ptr<slint::Model<ModelData>> model)
{
auto self = std::make_shared<LiveReloadModelWrapper<ModelData>>(model);
@ -342,6 +350,19 @@ slint::interpreter::Value into_slint_value(const std::shared_ptr<slint::Model<Mo
return LiveReloadModelWrapper<ModelData>::wrap(val);
}
template<typename ModelData>
std::shared_ptr<slint::Model<ModelData>>
from_slint_value(const slint::interpreter::Value &value,
const std::shared_ptr<slint::Model<ModelData>> *)
{
if (const LiveReloadModelWrapperBase *base = LiveReloadModelWrapperBase::get(value)) {
if (auto wrapper = dynamic_cast<const LiveReloadModelWrapper<ModelData> *>(base)) {
return wrapper->model;
}
}
return {};
}
} // namespace slint::private_api::live_reload
#endif // SLINT_FEATURE_LIVE_RELOAD