Fix 'Mask' node missing Properties widget; fix crash with 'Brightness/Contrast Classic' node (#3404)
* Fix 'Mask' node missing Properties widget; fix crash with 'Brightness/Contrast Classic' node Also clean up dead code and improve tooltip for the "-" Properties panel widget fallback. * format type --------- Co-authored-by: Adam <adamgerhant@gmail.com>
This commit is contained in:
parent
7afbeaa1f9
commit
6e66c79392
|
|
@ -21,8 +21,8 @@ impl DialogLayoutHolder for AboutGraphiteDialog {
|
||||||
fn layout_column_2(&self) -> Layout {
|
fn layout_column_2(&self) -> Layout {
|
||||||
let links = [
|
let links = [
|
||||||
("Heart", "Donate", "https://graphite.rs/donate/"),
|
("Heart", "Donate", "https://graphite.rs/donate/"),
|
||||||
("Volunteer", "Volunteer", "https://graphite.rs/volunteer/"),
|
|
||||||
("GraphiteLogo", "Website", "https://graphite.rs"),
|
("GraphiteLogo", "Website", "https://graphite.rs"),
|
||||||
|
("Volunteer", "Volunteer", "https://graphite.rs/volunteer/"),
|
||||||
("Credits", "Credits", "https://github.com/GraphiteEditor/Graphite/graphs/contributors"),
|
("Credits", "Credits", "https://github.com/GraphiteEditor/Graphite/graphs/contributors"),
|
||||||
];
|
];
|
||||||
let mut widgets = links
|
let mut widgets = links
|
||||||
|
|
|
||||||
|
|
@ -2021,47 +2021,6 @@ fn static_input_properties() -> InputProperties {
|
||||||
Ok(vec![cellular_jitter.into()])
|
Ok(vec![cellular_jitter.into()])
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
map.insert(
|
|
||||||
"brightness".to_string(),
|
|
||||||
Box::new(|node_id, index, context| {
|
|
||||||
let document_node = node_properties::get_document_node(node_id, context)?;
|
|
||||||
let is_use_classic = document_node
|
|
||||||
.inputs
|
|
||||||
.iter()
|
|
||||||
.find_map(|input| match input.as_value() {
|
|
||||||
Some(&TaggedValue::Bool(use_classic)) => Some(use_classic),
|
|
||||||
_ => None,
|
|
||||||
})
|
|
||||||
.unwrap_or(false);
|
|
||||||
let (b_min, b_max) = if is_use_classic { (-100., 100.) } else { (-100., 150.) };
|
|
||||||
let brightness = node_properties::number_widget(
|
|
||||||
ParameterWidgetsInfo::new(node_id, index, true, context),
|
|
||||||
NumberInput::default().mode_range().range_min(Some(b_min)).range_max(Some(b_max)).unit("%").display_decimal_places(2),
|
|
||||||
);
|
|
||||||
Ok(vec![brightness.into()])
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
map.insert(
|
|
||||||
"contrast".to_string(),
|
|
||||||
Box::new(|node_id, index, context| {
|
|
||||||
let document_node = node_properties::get_document_node(node_id, context)?;
|
|
||||||
|
|
||||||
let is_use_classic = document_node
|
|
||||||
.inputs
|
|
||||||
.iter()
|
|
||||||
.find_map(|input| match input.as_value() {
|
|
||||||
Some(&TaggedValue::Bool(use_classic)) => Some(use_classic),
|
|
||||||
_ => None,
|
|
||||||
})
|
|
||||||
.unwrap_or(false);
|
|
||||||
let (c_min, c_max) = if is_use_classic { (-100., 100.) } else { (-50., 100.) };
|
|
||||||
let contrast = node_properties::number_widget(
|
|
||||||
ParameterWidgetsInfo::new(node_id, index, true, context),
|
|
||||||
NumberInput::default().mode_range().range_min(Some(c_min)).range_max(Some(c_max)).unit("%").display_decimal_places(2),
|
|
||||||
);
|
|
||||||
Ok(vec![contrast.into()])
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
map.insert(
|
map.insert(
|
||||||
"assign_colors_gradient".to_string(),
|
"assign_colors_gradient".to_string(),
|
||||||
Box::new(|node_id, index, context| {
|
Box::new(|node_id, index, context| {
|
||||||
|
|
@ -2091,21 +2050,6 @@ fn static_input_properties() -> InputProperties {
|
||||||
Ok(vec![repeat_every_row.into()])
|
Ok(vec![repeat_every_row.into()])
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
map.insert(
|
|
||||||
"mask_stencil".to_string(),
|
|
||||||
Box::new(|node_id, index, context| {
|
|
||||||
let mask = node_properties::color_widget(ParameterWidgetsInfo::new(node_id, index, true, context), ColorInput::default());
|
|
||||||
Ok(vec![mask])
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
map.insert(
|
|
||||||
"spline_input".to_string(),
|
|
||||||
Box::new(|node_id, index, context| {
|
|
||||||
Ok(vec![LayoutGroup::Row {
|
|
||||||
widgets: node_properties::array_of_vec2_widget(ParameterWidgetsInfo::new(node_id, index, true, context), TextInput::default().centered(true)),
|
|
||||||
}])
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
map.insert(
|
map.insert(
|
||||||
"transform_rotation".to_string(),
|
"transform_rotation".to_string(),
|
||||||
Box::new(|node_id, index, context| {
|
Box::new(|node_id, index, context| {
|
||||||
|
|
|
||||||
|
|
@ -232,7 +232,12 @@ pub(crate) fn property_from_type(
|
||||||
.tooltip(format!(
|
.tooltip(format!(
|
||||||
"This data can only be supplied through the node graph because no widget exists for its type:\n\
|
"This data can only be supplied through the node graph because no widget exists for its type:\n\
|
||||||
{}",
|
{}",
|
||||||
concrete_type.name
|
// TODO: Avoid needing to remove spaces here by fixing how `alias` is generated
|
||||||
|
concrete_type
|
||||||
|
.alias
|
||||||
|
.as_deref()
|
||||||
|
.map(|s| s.to_string().replace(" ", ""))
|
||||||
|
.unwrap_or_else(|| graphene_std::format_type(concrete_type.name.as_ref()))
|
||||||
))
|
))
|
||||||
.widget_holder(),
|
.widget_holder(),
|
||||||
]);
|
]);
|
||||||
|
|
@ -1087,7 +1092,9 @@ pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &mut Node
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let use_classic_value = match document_node.inputs[UseClassicInput::INDEX].as_value() {
|
let use_classic_value = document_node.inputs.get(UseClassicInput::INDEX);
|
||||||
|
let includes_use_classic = use_classic_value.is_some();
|
||||||
|
let use_classic_value = match use_classic_value.and_then(|input| input.as_value()) {
|
||||||
Some(TaggedValue::Bool(use_classic_choice)) => *use_classic_choice,
|
Some(TaggedValue::Bool(use_classic_choice)) => *use_classic_choice,
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
|
|
@ -1114,11 +1121,11 @@ pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &mut Node
|
||||||
.range_max(Some(100.)),
|
.range_max(Some(100.)),
|
||||||
);
|
);
|
||||||
|
|
||||||
let layout = vec![
|
let mut layout = vec![LayoutGroup::Row { widgets: brightness }, LayoutGroup::Row { widgets: contrast }];
|
||||||
LayoutGroup::Row { widgets: brightness },
|
if includes_use_classic {
|
||||||
LayoutGroup::Row { widgets: contrast },
|
// TODO: When we no longer use this function in the temporary "Brightness/Contrast Classic" node, remove this conditional pushing and just always include this
|
||||||
LayoutGroup::Row { widgets: use_classic },
|
layout.push(LayoutGroup::Row { widgets: use_classic });
|
||||||
];
|
}
|
||||||
|
|
||||||
layout
|
layout
|
||||||
}
|
}
|
||||||
|
|
@ -1596,18 +1603,11 @@ pub(crate) fn generate_node_properties(node_id: NodeId, context: &mut NodeProper
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut input_types = implementations
|
let mut input_types = implementations.keys().filter_map(|item| item.inputs.get(input_index)).collect::<Vec<_>>();
|
||||||
.keys()
|
|
||||||
.filter_map(|item| item.inputs.get(input_index))
|
|
||||||
.filter(|ty| property_from_type(node_id, input_index, ty, number_options, unit_suffix, display_decimal_places, step, context).is_ok())
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
input_types.sort_by_key(|ty| ty.type_name());
|
input_types.sort_by_key(|ty| ty.type_name());
|
||||||
let input_type = input_types.first().cloned();
|
let input_type = input_types.first().cloned();
|
||||||
|
|
||||||
let Some(input_type) = input_type else {
|
let Some(input_type) = input_type else { return Vec::new() };
|
||||||
return Vec::new();
|
|
||||||
};
|
|
||||||
|
|
||||||
input_type.clone()
|
input_type.clone()
|
||||||
}
|
}
|
||||||
_ => context
|
_ => context
|
||||||
|
|
|
||||||
|
|
@ -354,7 +354,7 @@ impl Type {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn format_type(ty: &str) -> String {
|
pub fn format_type(ty: &str) -> String {
|
||||||
ty.split('<')
|
ty.split('<')
|
||||||
.map(|path| path.split(',').map(|path| path.split("::").last().unwrap_or(path)).collect::<Vec<_>>().join(","))
|
.map(|path| path.split(',').map(|path| path.split("::").last().unwrap_or(path)).collect::<Vec<_>>().join(","))
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
|
|
|
||||||
|
|
@ -141,9 +141,9 @@ fn make_opaque<T: Adjust<Color>>(
|
||||||
input
|
input
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See [`brightness_contrast`]
|
// TODO: Remove this once GPU shader nodes are able to support the non-classic algorithm
|
||||||
#[node_macro::node(
|
#[node_macro::node(
|
||||||
name("Brightness/Contrast classic"),
|
name("Brightness/Contrast Classic"),
|
||||||
category("Raster: Adjustment"),
|
category("Raster: Adjustment"),
|
||||||
properties("brightness_contrast_properties"),
|
properties("brightness_contrast_properties"),
|
||||||
shader_node(PerPixelAdjust)
|
shader_node(PerPixelAdjust)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue