Skip to content
This repository was archived by the owner on Oct 4, 2021. It is now read-only.

Commit d391c51

Browse files
committed
[NuGet] Make tab labels behave like real tabs with VO
Fixes VSTS #1021556
1 parent e775365 commit d391c51

File tree

2 files changed

+51
-10
lines changed

2 files changed

+51
-10
lines changed

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.UI.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ internal partial class ManagePackagesDialog : ExtendedTitleBarDialog
6868
Label installedLabel;
6969
Label updatesLabel;
7070
Label consolidateLabel;
71+
HBox tabGroup;
7172
VBox projectsListViewVBox;
7273
Label projectsListViewLabel;
7374
ListView projectsListView;
@@ -99,40 +100,39 @@ void Build ()
99100
packageSourceComboBox.MinWidth = 200;
100101
topHBox.PackStart (packageSourceComboBox);
101102

103+
tabGroup = new HBox ();
104+
102105
int tabLabelMinWidth = 60;
103106
browseLabel = new Label ();
104107
browseLabel.Text = GettextCatalog.GetString ("Browse");
105108
browseLabel.Tag = browseLabel.Text;
106109
browseLabel.MinWidth = tabLabelMinWidth;
107110
browseLabel.MarginLeft = 10;
108111
browseLabel.CanGetFocus = true;
109-
browseLabel.Accessible.Role = Xwt.Accessibility.Role.Button;
110-
111-
topHBox.PackStart (browseLabel);
112+
tabGroup.PackStart (browseLabel);
112113

113114
installedLabel = new Label ();
114115
installedLabel.Text = GettextCatalog.GetString ("Installed");
115116
installedLabel.Tag = installedLabel.Text;
116117
installedLabel.MinWidth = tabLabelMinWidth;
117118
installedLabel.CanGetFocus = true;
118-
installedLabel.Accessible.Role = Xwt.Accessibility.Role.Button;
119-
topHBox.PackStart (installedLabel);
119+
tabGroup.PackStart (installedLabel);
120120

121121
updatesLabel = new Label ();
122122
updatesLabel.Text = GettextCatalog.GetString ("Updates");
123123
updatesLabel.Tag = updatesLabel.Text;
124124
updatesLabel.MinWidth = tabLabelMinWidth;
125125
updatesLabel.CanGetFocus = true;
126-
updatesLabel.Accessible.Role = Xwt.Accessibility.Role.Button;
127-
topHBox.PackStart (updatesLabel);
126+
tabGroup.PackStart (updatesLabel);
128127

129128
consolidateLabel = new Label ();
130129
consolidateLabel.Text = GettextCatalog.GetString ("Consolidate");
131130
consolidateLabel.Tag = consolidateLabel.Text;
132131
consolidateLabel.MinWidth = tabLabelMinWidth;
133132
consolidateLabel.CanGetFocus = true;
134-
consolidateLabel.Accessible.Role = Xwt.Accessibility.Role.Button;
135-
topHBox.PackStart (consolidateLabel);
133+
tabGroup.PackStart (consolidateLabel);
134+
135+
topHBox.PackStart (tabGroup);
136136

137137
packageSearchEntry = new SearchTextEntry ();
138138
packageSearchEntry.Name = "managePackagesDialogSearchEntry";

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
using System;
2828
using System.Collections.Generic;
2929
using System.Linq;
30+
using MonoDevelop.Components.AtkCocoaHelper;
3031
using MonoDevelop.Core;
3132
using MonoDevelop.Ide;
3233
using MonoDevelop.Projects;
@@ -90,7 +91,6 @@ public ManagePackagesDialog (
9091
consolidateLabel.Visible = viewModel.IsManagingSolution;
9192
UpdateDialogTitle ();
9293
UpdatePackageSearchEntryWithInitialText (initialSearch);
93-
UpdatePackageResultsPageLabels ();
9494

9595
InitializeListView ();
9696
UpdateAddPackagesButton ();
@@ -113,6 +113,33 @@ public ManagePackagesDialog (
113113
updatesLabel.KeyPressed += UpdatesLabelKeyPressed;
114114
consolidateLabel.ButtonPressed += ConsolidateLabelButtonPressed;
115115
consolidateLabel.KeyPressed += ConsolidateLabelKeyPressed;
116+
UpdateTabAccessibility ();
117+
UpdatePackageResultsPageLabels ();
118+
}
119+
120+
void UpdateTabAccessibility ()
121+
{
122+
if (tabGroup.Surface.ToolkitEngine.Type == ToolkitType.Gtk) {
123+
if (consolidateLabel.Parent.Surface.NativeWidget is Gtk.Container a11yGroup) {
124+
a11yGroup.Accessible.SetRole (AtkCocoa.Roles.AXTabGroup);
125+
var children = a11yGroup.Children;
126+
var tabs = new List<Atk.Object> (children.Length);
127+
foreach (var child in children) {
128+
if (!child.Visible)
129+
continue;
130+
if (child is Gtk.EventBox box && box.Child is Gtk.Label) {
131+
box.Accessible.SetTitleUIElement (box.Child.Accessible);
132+
box.Child.Accessible.SetShouldIgnore (true);
133+
}
134+
var tab = child.Accessible;
135+
tab.SetRole (AtkCocoa.Roles.AXRadioButton);
136+
tab.SetSubRole (AtkCocoa.SubRoles.AXTabButton);
137+
tab.SetValue (false);
138+
tabs.Add (tab);
139+
}
140+
a11yGroup.Accessible.SetTabs (tabs.ToArray ());
141+
}
142+
}
116143
}
117144

118145
public bool ShowPreferencesForPackageSources { get; private set; }
@@ -1110,12 +1137,26 @@ void UpdatePackageResultsLabel (ManagePackagesPage page, Label label)
11101137
{
11111138
string text = (string)label.Tag;
11121139
if (page == viewModel.PageSelected) {
1140+
UpdatePackageResultsLabelA11y (label, true);
11131141
label.Markup = string.Format ("<b><u>{0}</u></b>", text);
11141142
} else {
1143+
UpdatePackageResultsLabelA11y (label, false);
11151144
label.Markup = text;
11161145
}
11171146
}
11181147

1148+
static void UpdatePackageResultsLabelA11y (Label label, bool active)
1149+
{
1150+
if (label.Surface.ToolkitEngine.Type == ToolkitType.Gtk) {
1151+
var widget = label.Surface.NativeWidget as Gtk.Widget;
1152+
if (widget != null) {
1153+
widget.Accessible.SetValue (active);
1154+
// FIXME: Accessible.SetValue has no effect, so set the role description instead
1155+
widget.Accessible.SetRole (AtkCocoa.Roles.AXRadioButton, active ? "selected tab" : "tab");
1156+
}
1157+
}
1158+
}
1159+
11191160
void UpdatePackageResultsLabel (ManagePackagesPage page, Button label)
11201161
{
11211162
string text = (string)label.Tag;

0 commit comments

Comments
 (0)