on xenial help sign in
Support Panel top level items to be disabled

I needed to change the way MenuContent changes its position from using the highlight to simply setting the contentX directly since otherwise in some reset cases the position was wrong (LP: #1670694) Approved by: Lukáš Tinkl, Unity8 CI Bot

commit799e37ce7b90c7156344f6f123795f21e14e9840 authorAlbert Astals Cid <albert.astals@canonical.com> dateTue 21 Mar 2017, 10:55 (10 years ago) parentc196bf9e52e226
8 files changed+102−11
qml/Panel/MenuContent.qml+2−2 qml/Panel/Panel.qml+1 qml/Panel/PanelBar.qml+16 qml/Panel/PanelItemRow.qml+32−6 qml/Panel/PanelMenu.qml+2−2 qml/Panel/PanelMenuPage.qml+1−1 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+24 tests/qmltests/Panel/tst_Panel.qml+24
qml/Panel/MenuContent.qml+2−2
@@ -44,9 +44,9 @@ Rectangle {
4444 anchors.fill: parent
4545 model: content.model
4646
47− highlightFollowsCurrentItem: true
47+ highlightFollowsCurrentItem: false
48+ contentX: currentIndex * width
4849 interactive: false
49− highlightMoveDuration: 0
5050 orientation: ListView.Horizontal
5151 // Load all the indicator menus (a big number)
5252 cacheBuffer: 1073741823
qml/Panel/Panel.qml+1
@@ -278,6 +278,7 @@ Item {
278278 id: actionItem
279279 property int ownIndex: index
280280 objectName: "appMenuItem"+index
281+ enabled: model.sensitive
281282
282283 width: _title.width + units.gu(2)
283284 height: parent.height
qml/Panel/PanelBar.qml+16
@@ -44,6 +44,22 @@ Item {
4444 row.selectItemAt(mapped.x);
4545 }
4646
47+ function selectPreviousItem() {
48+ if (!expanded) {
49+ row.resetCurrentItem();
50+ }
51+ row.selectPreviousItem();
52+ d.alignIndicators();
53+ }
54+
55+ function selectNextItem() {
56+ if (!expanded) {
57+ row.resetCurrentItem();
58+ }
59+ row.selectNextItem();
60+ d.alignIndicators();
61+ }
62+
4763 function setCurrentItemIndex(index) {
4864 if (!expanded) {
4965 row.resetCurrentItem();
qml/Panel/PanelItemRow.qml+32−6
@@ -96,31 +96,57 @@ Item {
9696 row.currentIndex = -1;
9797 }
9898
99+ function selectPreviousItem() {
100+ var indexToSelect = currentItemIndex - 1;
101+ while (indexToSelect >= 0) {
102+ if (setCurrentItemIndex(indexToSelect))
103+ return;
104+ indexToSelect = indexToSelect - 1;
105+ }
106+ }
107+
108+ function selectNextItem() {
109+ var indexToSelect = currentItemIndex + 1;
110+ while (indexToSelect < row.contentItem.children.length) {
111+ if (setCurrentItemIndex(indexToSelect))
112+ return;
113+ indexToSelect = indexToSelect + 1;
114+ }
115+ }
116+
99117 function setCurrentItemIndex(index) {
100118 for (var i = 0; i < row.contentItem.children.length; i++) {
101119 var item = row.contentItem.children[i];
102− if (item.hasOwnProperty("ownIndex") && item.ownIndex === index) {
103− if (currentItem !== item) row.currentIndex = index;
104− break;
120+ if (item.hasOwnProperty("ownIndex") && item.ownIndex === index && item.enabled) {
121+ if (currentItem !== item) {
122+ row.currentIndex = index;
123+ }
124+ return true;
105125 }
106126 }
127+ return false;
107128 }
108129
109130 function selectItemAt(lateralPosition) {
110131 var item = indicatorAt(lateralPosition, 0);
111− if (item && item.opacity > 0) {
132+ if (item && item.opacity > 0 && item.enabled) {
112133 row.currentIndex = item.ownIndex;
113134 } else {
114135 // Select default item.
115136 var searchIndex = lateralPosition >= width ? row.count - 1 : 0;
116137
117138 for (var i = 0; i < row.contentItem.children.length; i++) {
118− if (row.contentItem.children[i].hasOwnProperty("ownIndex") && row.contentItem.children[i].ownIndex === searchIndex) {
139+ if (row.contentItem.children[i].hasOwnProperty("ownIndex") &&
140+ row.contentItem.children[i].ownIndex === searchIndex &&
141+ row.contentItem.children[i].enabled)
142+ {
119143 item = row.contentItem.children[i];
120144 break;
121145 }
122146 }
123− if (currentItem !== item) row.currentIndex = item ? item.ownIndex : -1;
147+ if (item && currentItem !== item) {
148+ row.currentIndex = item.ownIndex;
149+ }
124150 }
125151 }
126152
qml/Panel/PanelMenu.qml+2−2
@@ -143,10 +143,10 @@ Showable {
143143
144144 Keys.onPressed: {
145145 if (event.key === Qt.Key_Left) {
146− bar.setCurrentItemIndex(bar.currentItemIndex - 1);
146+ bar.selectPreviousItem();
147147 event.accepted = true;
148148 } else if (event.key === Qt.Key_Right) {
149− bar.setCurrentItemIndex(bar.currentItemIndex + 1);
149+ bar.selectNextItem();
150150 event.accepted = true;
151151 } else if (event.key === Qt.Key_Escape) {
152152 root.hide();
qml/Panel/PanelMenuPage.qml+1−1
@@ -63,7 +63,7 @@ PageStack {
6363 if (model) {
6464 push(pageComponent, { "menuModel": model });
6565 }
66− } else {
66+ } else if (root.currentPage) {
6767 root.currentPage.reset();
6868 }
6969 }
tests/qmltests/ApplicationMenus/tst_MenuBar.qml+24
@@ -226,6 +226,30 @@ Item {
226226 keyRelease(data.tag, Qt.AltModifier, 100);
227227 }
228228
229+ function test_disabledTopLevel() {
230+ var modelData = appMenuData.generateTestData(3,3,0,0,"menu");
231+ modelData[1].rowData.sensitive = false;
232+ menuBackend.modelData = modelData;
233+
234+ var priv = findInvisibleChild(menuBar, "d");
235+
236+ var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0);
237+ var menuItem2 = findChild(menuBar, "menuBar-item2"); verify(menuItem2);
238+
239+ menuItem0.show();
240+ compare(menuItem0.popupVisible, true, "Popup should be visible");
241+
242+ keyClick(Qt.Key_Right);
243+ compare(priv.currentItem, menuItem2);
244+ compare(menuItem2.popupVisible, true);
245+ compare(menuItem0.popupVisible, false);
246+
247+ keyClick(Qt.Key_Left);
248+ compare(priv.currentItem, menuItem0);
249+ compare(menuItem2.popupVisible, false);
250+ compare(menuItem0.popupVisible, true);
251+ }
252+
229253 function test_menuActivateClosesMenu() {
230254 menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
231255 var priv = findInvisibleChild(menuBar, "d");
tests/qmltests/Panel/tst_Panel.qml+24
@@ -872,5 +872,29 @@ PanelTest {
872872 keyClick(Qt.Key_Enter);
873873 compare(aboutToShowCalledSpy.count, 1);
874874 }
875+
876+ function test_disabledTopLevel() {
877+ var modelData = appMenuData.generateTestData(3,3,0,0,"menu");
878+ modelData[1].rowData.sensitive = false;
879+ panel.applicationMenus.model.modelData = modelData;
880+
881+ waitForRendering(panel);
882+
883+ aboutToShowCalledSpy.target = panel.applicationMenus.model
884+ aboutToShowCalledSpy.clear();
885+
886+ var indicatorsBar = findChild(panel.applicationMenus, "indicatorsBar");
887+
888+ PanelState.title = "Fake Title"
889+ pullDownApplicationsMenu();
890+
891+ tryCompare(indicatorsBar, "currentItemIndex", 0);
892+
893+ keyClick(Qt.Key_Right);
894+ tryCompare(indicatorsBar, "currentItemIndex", 2);
895+
896+ keyClick(Qt.Key_Left);
897+ tryCompare(indicatorsBar, "currentItemIndex", 0);
898+ }
875899 }
876900}