Skip to content

Commit 13ab375

Browse files
authored
Merge pull request #484 from StatisMike/feature/export_range_step
Addition of step in export_range
2 parents 8ec6a22 + e397653 commit 13ab375

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

godot-core/src/property.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -153,22 +153,26 @@ pub mod export_info_functions {
153153
pub fn export_range(
154154
min: f64,
155155
max: f64,
156+
step: Option<f64>,
156157
or_greater: bool,
157158
or_less: bool,
158159
exp: bool,
159160
radians: bool,
160161
degrees: bool,
161162
hide_slider: bool,
162163
) -> PropertyHintInfo {
163-
let min_max = format!("{},{}", min, max);
164-
164+
let hint_beginning = if let Some(step) = step {
165+
format!("{min},{max},{step}")
166+
} else {
167+
format!("{min},{max}")
168+
};
165169
let rest =
166170
comma_separate_boolean_idents!(or_greater, or_less, exp, radians, degrees, hide_slider);
167171

168172
let hint_string = if rest.is_empty() {
169-
min_max
173+
hint_beginning
170174
} else {
171-
format!("{min_max},{rest}")
175+
format!("{hint_beginning},{rest}")
172176
};
173177

174178
PropertyHintInfo {

godot-macros/src/class/data_models/field_export.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub enum FieldExport {
3131
Range {
3232
min: TokenStream,
3333
max: TokenStream,
34+
step: TokenStream,
3435
or_greater: bool,
3536
or_less: bool,
3637
exp: bool,
@@ -265,6 +266,15 @@ impl FieldExport {
265266

266267
let min = parser.next_expr()?;
267268
let max = parser.next_expr()?;
269+
// TODO: During parser refactor, try to remove the need for `is_next_ident` there. Currently needed only for this functionality.
270+
// See discussion for rationale here: https://github.com/godot-rust/gdext/pull/484#pullrequestreview-1738612069
271+
let step = match parser.is_next_ident() {
272+
Some(false) => {
273+
let value = parser.next_expr()?;
274+
quote! { Some(#value) }
275+
}
276+
_ => quote! { None },
277+
};
268278

269279
let mut options = HashSet::new();
270280

@@ -277,6 +287,7 @@ impl FieldExport {
277287
Ok(FieldExport::Range {
278288
min,
279289
max,
290+
step,
280291
or_greater: options.contains("or_greater"),
281292
or_less: options.contains("or_less"),
282293
exp: options.contains("exp"),
@@ -360,14 +371,15 @@ impl FieldExport {
360371
FieldExport::Range {
361372
min,
362373
max,
374+
step,
363375
or_greater,
364376
or_less,
365377
exp,
366378
radians,
367379
degrees,
368380
hide_slider,
369381
} => quote_export_func! {
370-
export_range(#min, #max, #or_greater, #or_less, #exp, #radians, #degrees, #hide_slider)
382+
export_range(#min, #max, #step, #or_greater, #or_less, #exp, #radians, #degrees, #hide_slider)
371383
},
372384

373385
FieldExport::Enum { variants } => {

godot-macros/src/util/list_parser.rs

+13
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,19 @@ impl ListParser {
132132
Ok(Some(kv.ident()?))
133133
}
134134

135+
/// Check if the next element of the list is an identifier.
136+
///
137+
/// Returns `None` if there are no more elements left, `Some(true)` if the next element is identifier and `Some(false)` if it is not.
138+
pub fn is_next_ident(&mut self) -> Option<bool> {
139+
let Some(kv) = self.peek() else {
140+
return None;
141+
};
142+
143+
let res = kv.as_ident();
144+
145+
Some(res.is_ok())
146+
}
147+
135148
/// Take the next element of the list, if it is an identifier.
136149
///
137150
/// Returns `Ok(None)` if there are no more elements left or the next element isn't an identifier.

itest/rust/build.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,8 @@ fn generate_property_template(inputs: &[Input]) -> PropertyTests {
424424
export_multiline: GString,
425425
#[export(range = (0.0, 20.0))]
426426
export_range_float_0_20: f64,
427-
// We're missing step currently.
428-
// #[export(range = (-10, 20 /*, 0.2 */))] export_range_float_neg_10_20_02: f64,
427+
#[export(range = (-10.0, 20.0, 0.2))]
428+
export_range_float_neg10_20_02: f64,
429429
// We can only export ranges of floats currently.
430430
// #[export(range = (0, 100, 1, "or_greater", "or_less"))] export_range_int_0_100_1_or_greater_or_less: int,
431431
#[export(exp_easing)]
@@ -473,7 +473,7 @@ fn generate_property_template(inputs: &[Input]) -> PropertyTests {
473473
@export_global_dir var export_global_dir: String
474474
@export_multiline var export_multiline: String
475475
@export_range(0, 20) var export_range_float_0_20: float
476-
@export_range(-10, 20, 0.2) var export_range_float_neg_10_20_02: float
476+
@export_range(-10, 20, 0.2) var export_range_float_neg10_20_02: float
477477
@export_range(0, 100, 1, "or_greater", "or_less") var export_range_int_0_100_1_or_greater_or_less: int
478478
@export_exp_easing var export_exp_easing: float
479479
@export_color_no_alpha var export_color_no_alpha: Color

itest/rust/src/object_tests/property_test.rs

+3
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ struct CheckAllExports {
237237
#[export(range = (0.0, 10.0, or_greater, or_less, exp, radians, hide_slider))]
238238
range_exported: f64,
239239

240+
#[export(range = (0.0, 10.0, 0.2, or_greater, or_less, exp, radians, hide_slider))]
241+
range_exported_with_step: f64,
242+
240243
#[export(enum = (A = 10, B, C, D = 20))]
241244
enum_exported: i64,
242245

0 commit comments

Comments
 (0)