Skip to content

Commit e0695cb

Browse files
committed
Add boolean string coercion and complete value conversion support
Parse "true"/"false" strings as Value::Bool in ring-to-slint conversion functions. Implement Model-to-ring-list iteration for slint_value_to_ring return values. Extend add_slint_value_to_ring_list with handling for Void, Struct, and nested Model value types.
1 parent 60e5233 commit e0695cb

1 file changed

Lines changed: 40 additions & 3 deletions

File tree

src/rust_src/src/slint/value.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use i_slint_core::model::Model;
12
use ring_lang_rs::{ffi, *};
23
use slint_interpreter::{Struct, Value};
34

@@ -22,7 +23,13 @@ pub fn ring_list_to_args(list: RingList) -> Vec<Value> {
2223
}
2324
ffi::ITEMTYPE_STRING => {
2425
let s = ring_list_getstring_str(list, i);
25-
Value::String(SharedString::from(s))
26+
if s == "true" {
27+
Value::Bool(true)
28+
} else if s == "false" {
29+
Value::Bool(false)
30+
} else {
31+
Value::String(SharedString::from(s))
32+
}
2633
}
2734
ffi::ITEMTYPE_LIST => {
2835
let sublist = ring_list_getlist(list, i);
@@ -41,7 +48,13 @@ pub fn ring_list_to_slint_value(p: *mut libc::c_void, param: i32) -> Value {
4148
Value::Number(ring_api_getnumber(p, param))
4249
} else if ring_api_isstring(p, param) {
4350
let s = ring_api_getstring_str(p, param);
44-
Value::String(SharedString::from(s))
51+
if s == "true" {
52+
Value::Bool(true)
53+
} else if s == "false" {
54+
Value::Bool(false)
55+
} else {
56+
Value::String(SharedString::from(s))
57+
}
4558
} else if ring_api_islist(p, param) {
4659
let list = ring_api_getlist(p, param);
4760
ring_list_to_slint_model_or_struct(list)
@@ -203,8 +216,13 @@ pub fn slint_value_to_ring(p: *mut libc::c_void, value: &Value) {
203216
Value::Void => {
204217
ring_ret_number!(p, 0.0);
205218
}
206-
Value::Model(_model) => {
219+
Value::Model(model) => {
207220
let list = ring_new_list!(p);
221+
for row in 0..model.row_count() {
222+
if let Some(val) = model.row_data(row) {
223+
add_slint_value_to_ring_list(list, &val);
224+
}
225+
}
208226
ring_ret_list!(p, list);
209227
}
210228
Value::Struct(s) => {
@@ -233,6 +251,25 @@ fn add_slint_value_to_ring_list(list: RingList, value: &Value) {
233251
Value::Bool(b) => {
234252
ring_list_addint(list, if *b { 1 } else { 0 });
235253
}
254+
Value::Void => {
255+
ring_list_addint(list, 0);
256+
}
257+
Value::Struct(s) => {
258+
let sublist = ring_list_newlist(list);
259+
for (key, val) in s.iter() {
260+
let pair = ring_list_newlist(sublist);
261+
ring_list_addstring_str(pair, key);
262+
add_slint_value_to_ring_list(pair, val);
263+
}
264+
}
265+
Value::Model(model) => {
266+
let sublist = ring_list_newlist(list);
267+
for row in 0..model.row_count() {
268+
if let Some(val) = model.row_data(row) {
269+
add_slint_value_to_ring_list(sublist, &val);
270+
}
271+
}
272+
}
236273
_ => {
237274
ring_list_addint(list, 0);
238275
}

0 commit comments

Comments
 (0)