diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2019-11-27 00:57:44 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-27 00:57:44 +0300 |
commit | ddacb6c206f0ea260b2af4edc23f8b1fcfaa7661 (patch) | |
tree | df0c78dc79ecbbf32d03bdbf84b390ce637cb36d /main | |
parent | a9a857c5fca1fcda54adf5ae911dc353c2dc12d5 (diff) | |
parent | d391c51d0d2ccb1c8bbc8e83068b21d23ba18fd4 (diff) |
Merge pull request #9387 from mono/fix1021556-nuget-accessible-tabs
[NuGet][1021556] Make tab labels behave like real tabs with VO
Diffstat (limited to 'main')
4 files changed, 67 insertions, 11 deletions
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.UI.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.UI.cs index b2761fc54f..f8e2435b85 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.UI.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.UI.cs @@ -69,6 +69,7 @@ namespace MonoDevelop.PackageManagement Label installedLabel; Label updatesLabel; Label consolidateLabel; + HBox tabGroup; VBox projectsListViewVBox; Label projectsListViewLabel; ListView projectsListView; @@ -110,6 +111,8 @@ namespace MonoDevelop.PackageManagement packageSourceComboBox.Accessible.LabelWidget = packageSourceLabel; topHBox.PackStart (packageSourceComboBox); + tabGroup = new HBox (); + int tabLabelMinWidth = 60; browseLabel = new Label (); browseLabel.Text = GettextCatalog.GetString ("Browse"); @@ -117,33 +120,30 @@ namespace MonoDevelop.PackageManagement browseLabel.MinWidth = tabLabelMinWidth; browseLabel.MarginLeft = 10; browseLabel.CanGetFocus = true; - browseLabel.Accessible.Role = Xwt.Accessibility.Role.Button; - - topHBox.PackStart (browseLabel); + tabGroup.PackStart (browseLabel); installedLabel = new Label (); installedLabel.Text = GettextCatalog.GetString ("Installed"); installedLabel.Tag = installedLabel.Text; installedLabel.MinWidth = tabLabelMinWidth; installedLabel.CanGetFocus = true; - installedLabel.Accessible.Role = Xwt.Accessibility.Role.Button; - topHBox.PackStart (installedLabel); + tabGroup.PackStart (installedLabel); updatesLabel = new Label (); updatesLabel.Text = GettextCatalog.GetString ("Updates"); updatesLabel.Tag = updatesLabel.Text; updatesLabel.MinWidth = tabLabelMinWidth; updatesLabel.CanGetFocus = true; - updatesLabel.Accessible.Role = Xwt.Accessibility.Role.Button; - topHBox.PackStart (updatesLabel); + tabGroup.PackStart (updatesLabel); consolidateLabel = new Label (); consolidateLabel.Text = GettextCatalog.GetString ("Consolidate"); consolidateLabel.Tag = consolidateLabel.Text; consolidateLabel.MinWidth = tabLabelMinWidth; consolidateLabel.CanGetFocus = true; - consolidateLabel.Accessible.Role = Xwt.Accessibility.Role.Button; - topHBox.PackStart (consolidateLabel); + tabGroup.PackStart (consolidateLabel); + + topHBox.PackStart (tabGroup); packageSearchEntry = new SearchTextEntry (); packageSearchEntry.Name = "managePackagesDialogSearchEntry"; diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs index ac6f6b1641..7934c29f42 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs @@ -91,7 +91,6 @@ namespace MonoDevelop.PackageManagement consolidateLabel.Visible = viewModel.IsManagingSolution; UpdateDialogTitle (); UpdatePackageSearchEntryWithInitialText (initialSearch); - UpdatePackageResultsPageLabels (); InitializeListView (); UpdateAddPackagesButton (); @@ -114,6 +113,33 @@ namespace MonoDevelop.PackageManagement updatesLabel.KeyPressed += UpdatesLabelKeyPressed; consolidateLabel.ButtonPressed += ConsolidateLabelButtonPressed; consolidateLabel.KeyPressed += ConsolidateLabelKeyPressed; + UpdateTabAccessibility (); + UpdatePackageResultsPageLabels (); + } + + void UpdateTabAccessibility () + { + if (tabGroup.Surface.ToolkitEngine.Type == ToolkitType.Gtk) { + if (consolidateLabel.Parent.Surface.NativeWidget is Gtk.Container a11yGroup) { + a11yGroup.Accessible.SetRole (AtkCocoa.Roles.AXTabGroup); + var children = a11yGroup.Children; + var tabs = new List<Atk.Object> (children.Length); + foreach (var child in children) { + if (!child.Visible) + continue; + if (child is Gtk.EventBox box && box.Child is Gtk.Label) { + box.Accessible.SetTitleUIElement (box.Child.Accessible); + box.Child.Accessible.SetShouldIgnore (true); + } + var tab = child.Accessible; + tab.SetRole (AtkCocoa.Roles.AXRadioButton); + tab.SetSubRole (AtkCocoa.SubRoles.AXTabButton); + tab.SetValue (false); + tabs.Add (tab); + } + a11yGroup.Accessible.SetTabs (tabs.ToArray ()); + } + } } public bool ShowPreferencesForPackageSources { get; private set; } @@ -1131,12 +1157,26 @@ namespace MonoDevelop.PackageManagement { string text = (string)label.Tag; if (page == viewModel.PageSelected) { + UpdatePackageResultsLabelA11y (label, true); label.Markup = string.Format ("<b><u>{0}</u></b>", text); } else { + UpdatePackageResultsLabelA11y (label, false); label.Markup = text; } } + static void UpdatePackageResultsLabelA11y (Label label, bool active) + { + if (label.Surface.ToolkitEngine.Type == ToolkitType.Gtk) { + var widget = label.Surface.NativeWidget as Gtk.Widget; + if (widget != null) { + widget.Accessible.SetValue (active); + // FIXME: Accessible.SetValue has no effect, so set the role description instead + widget.Accessible.SetRole (AtkCocoa.Roles.AXRadioButton, active ? "selected tab" : "tab"); + } + } + } + void UpdatePackageResultsLabel (ManagePackagesPage page, Button label) { string text = (string)label.Tag; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelper.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelper.cs index ae898d8000..f7bf217ada 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelper.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelper.cs @@ -154,6 +154,7 @@ namespace MonoDevelop.Components.AtkCocoaHelper public enum SubRoles { AXCloseButton, + AXTabButton, }; public struct Range diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelperMac.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelperMac.cs index 62981cfc3e..97a4060dcf 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelperMac.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.AtkCocoaHelper/AtkCocoaHelperMac.cs @@ -214,12 +214,22 @@ namespace MonoDevelop.Components.AtkCocoaHelper public static void SetValue (this Atk.Object o, string stringValue) { + SetValue (o, (NSObject) new NSString (stringValue)); + } + + public static void SetValue (this Atk.Object o, object value) + { + SetValue (o, NSObject.FromObject (value)); + } + + static void SetValue (this Atk.Object o, NSObject value) + { var nsa = GetNSAccessibilityElement (o); if (nsa == null) { return; } - nsa.AccessibilityValue = new NSString (stringValue); + nsa.AccessibilityValue = value; } public static void SetUrl (this Atk.Object o, string url) @@ -261,6 +271,11 @@ namespace MonoDevelop.Components.AtkCocoaHelper nsa.AccessibilitySubrole = subrole; } + public static void SetSubRole (this Atk.Object o, AtkCocoa.SubRoles subrole) + { + o.SetSubRole (subrole.ToString ()); + } + public static void SetTitleUIElement (this Atk.Object o, Atk.Object title) { var nsa = GetNSAccessibilityElement (o); |