Skip to content

Commit cd25350

Browse files
WcubedWybe Westra
authored andcommitted
Disabled widgets are now also disabled in the accesskit output (emilk#4750)
Marking widgets as disabled was not reflected in the accesskit output, now the disabled status should match. --------- Co-authored-by: Wybe Westra <[email protected]>
1 parent ad536ee commit cd25350

File tree

18 files changed

+161
-68
lines changed

18 files changed

+161
-68
lines changed

crates/egui/src/containers/collapsing_header.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,9 @@ impl CollapsingHeader {
540540
header_response.mark_changed();
541541
}
542542

543-
header_response
544-
.widget_info(|| WidgetInfo::labeled(WidgetType::CollapsingHeader, galley.text()));
543+
header_response.widget_info(|| {
544+
WidgetInfo::labeled(WidgetType::CollapsingHeader, ui.is_enabled(), galley.text())
545+
});
545546

546547
let openness = state.openness(ui.ctx());
547548

crates/egui/src/containers/combo_box.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,13 @@ impl ComboBox {
213213
(width, height),
214214
);
215215
if let Some(label) = label {
216-
ir.response
217-
.widget_info(|| WidgetInfo::labeled(WidgetType::ComboBox, label.text()));
216+
ir.response.widget_info(|| {
217+
WidgetInfo::labeled(WidgetType::ComboBox, ui.is_enabled(), label.text())
218+
});
218219
ir.response |= ui.label(label);
219220
} else {
220221
ir.response
221-
.widget_info(|| WidgetInfo::labeled(WidgetType::ComboBox, ""));
222+
.widget_info(|| WidgetInfo::labeled(WidgetType::ComboBox, ui.is_enabled(), ""));
222223
}
223224
ir
224225
})

crates/egui/src/data/output.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -547,42 +547,50 @@ impl WidgetInfo {
547547
}
548548

549549
#[allow(clippy::needless_pass_by_value)]
550-
pub fn labeled(typ: WidgetType, label: impl ToString) -> Self {
550+
pub fn labeled(typ: WidgetType, enabled: bool, label: impl ToString) -> Self {
551551
Self {
552+
enabled,
552553
label: Some(label.to_string()),
553554
..Self::new(typ)
554555
}
555556
}
556557

557558
/// checkboxes, radio-buttons etc
558559
#[allow(clippy::needless_pass_by_value)]
559-
pub fn selected(typ: WidgetType, selected: bool, label: impl ToString) -> Self {
560+
pub fn selected(typ: WidgetType, enabled: bool, selected: bool, label: impl ToString) -> Self {
560561
Self {
562+
enabled,
561563
label: Some(label.to_string()),
562564
selected: Some(selected),
563565
..Self::new(typ)
564566
}
565567
}
566568

567-
pub fn drag_value(value: f64) -> Self {
569+
pub fn drag_value(enabled: bool, value: f64) -> Self {
568570
Self {
571+
enabled,
569572
value: Some(value),
570573
..Self::new(WidgetType::DragValue)
571574
}
572575
}
573576

574577
#[allow(clippy::needless_pass_by_value)]
575-
pub fn slider(value: f64, label: impl ToString) -> Self {
578+
pub fn slider(enabled: bool, value: f64, label: impl ToString) -> Self {
576579
let label = label.to_string();
577580
Self {
581+
enabled,
578582
label: if label.is_empty() { None } else { Some(label) },
579583
value: Some(value),
580584
..Self::new(WidgetType::Slider)
581585
}
582586
}
583587

584588
#[allow(clippy::needless_pass_by_value)]
585-
pub fn text_edit(prev_text_value: impl ToString, text_value: impl ToString) -> Self {
589+
pub fn text_edit(
590+
enabled: bool,
591+
prev_text_value: impl ToString,
592+
text_value: impl ToString,
593+
) -> Self {
586594
let text_value = text_value.to_string();
587595
let prev_text_value = prev_text_value.to_string();
588596
let prev_text_value = if text_value == prev_text_value {
@@ -591,6 +599,7 @@ impl WidgetInfo {
591599
Some(prev_text_value)
592600
};
593601
Self {
602+
enabled,
594603
current_text_value: Some(text_value),
595604
prev_text_value,
596605
..Self::new(WidgetType::TextEdit)
@@ -599,10 +608,12 @@ impl WidgetInfo {
599608

600609
#[allow(clippy::needless_pass_by_value)]
601610
pub fn text_selection_changed(
611+
enabled: bool,
602612
text_selection: std::ops::RangeInclusive<usize>,
603613
current_text_value: impl ToString,
604614
) -> Self {
605615
Self {
616+
enabled,
606617
text_selection: Some(text_selection),
607618
current_text_value: Some(current_text_value.to_string()),
608619
..Self::new(WidgetType::TextEdit)

crates/egui/src/menu.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,11 @@ impl SubMenuButton {
524524

525525
let (rect, response) = ui.allocate_at_least(desired_size, sense);
526526
response.widget_info(|| {
527-
crate::WidgetInfo::labeled(crate::WidgetType::Button, text_galley.text())
527+
crate::WidgetInfo::labeled(
528+
crate::WidgetType::Button,
529+
ui.is_enabled(),
530+
text_galley.text(),
531+
)
528532
});
529533

530534
if ui.is_rect_visible(rect) {

crates/egui/src/response.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,9 @@ impl Response {
880880

881881
#[cfg(feature = "accesskit")]
882882
pub(crate) fn fill_accesskit_node_common(&self, builder: &mut accesskit::NodeBuilder) {
883+
if !self.enabled {
884+
builder.set_disabled();
885+
}
883886
builder.set_bounds(accesskit::Rect {
884887
x0: self.rect.min.x.into(),
885888
y0: self.rect.min.y.into(),
@@ -921,6 +924,9 @@ impl Response {
921924
WidgetType::ProgressIndicator => Role::ProgressIndicator,
922925
WidgetType::Other => Role::Unknown,
923926
});
927+
if !info.enabled {
928+
builder.set_disabled();
929+
}
924930
if let Some(label) = info.label {
925931
builder.set_name(label);
926932
}

crates/egui/src/widgets/button.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ impl Widget for Button<'_> {
265265
let (rect, mut response) = ui.allocate_at_least(desired_size, sense);
266266
response.widget_info(|| {
267267
if let Some(galley) = &galley {
268-
WidgetInfo::labeled(WidgetType::Button, galley.text())
268+
WidgetInfo::labeled(WidgetType::Button, ui.is_enabled(), galley.text())
269269
} else {
270270
WidgetInfo::new(WidgetType::Button)
271271
}

crates/egui/src/widgets/checkbox.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ impl<'a> Widget for Checkbox<'a> {
8282
if indeterminate {
8383
WidgetInfo::labeled(
8484
WidgetType::Checkbox,
85+
ui.is_enabled(),
8586
galley.as_ref().map_or("", |x| x.text()),
8687
)
8788
} else {
8889
WidgetInfo::selected(
8990
WidgetType::Checkbox,
91+
ui.is_enabled(),
9092
*checked,
9193
galley.as_ref().map_or("", |x| x.text()),
9294
)

crates/egui/src/widgets/drag_value.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ impl<'a> Widget for DragValue<'a> {
621621

622622
response.changed = get(&mut get_set_value) != old_value;
623623

624-
response.widget_info(|| WidgetInfo::drag_value(value));
624+
response.widget_info(|| WidgetInfo::drag_value(ui.is_enabled(), value));
625625

626626
#[cfg(feature = "accesskit")]
627627
ui.ctx().accesskit_node_builder(response.id, |builder| {

crates/egui/src/widgets/hyperlink.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ impl Widget for Link {
3737
let label = Label::new(text).sense(Sense::click());
3838

3939
let (galley_pos, galley, response) = label.layout_in_ui(ui);
40-
response.widget_info(|| WidgetInfo::labeled(WidgetType::Link, galley.text()));
40+
response
41+
.widget_info(|| WidgetInfo::labeled(WidgetType::Link, ui.is_enabled(), galley.text()));
4142

4243
if ui.is_rect_visible(response.rect) {
4344
let color = ui.visuals().hyperlink_color;

crates/egui/src/widgets/label.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ impl Widget for Label {
229229
let selectable = self.selectable;
230230

231231
let (galley_pos, galley, mut response) = self.layout_in_ui(ui);
232-
response.widget_info(|| WidgetInfo::labeled(WidgetType::Label, galley.text()));
232+
response
233+
.widget_info(|| WidgetInfo::labeled(WidgetType::Label, ui.is_enabled(), galley.text()));
233234

234235
if ui.is_rect_visible(response.rect) {
235236
if galley.elided {

0 commit comments

Comments
 (0)