on xenial help sign in
Support Panel top level items to be disabled
799e37cAlbert Astals Cid
qml/Panel/MenuContent.qml+2−2
@@ -44,9 +44,9 @@ Rectangle {
44 anchors.fill: parent
44 anchors.fill: parent
45 model: content.model
45 model: content.model
46
46
47− highlightFollowsCurrentItem: true
47+ highlightFollowsCurrentItem: false
48+ contentX: currentIndex * width
48 interactive: false
49 interactive: false
49− highlightMoveDuration: 0
50 orientation: ListView.Horizontal
50 orientation: ListView.Horizontal
51 // Load all the indicator menus (a big number)
51 // Load all the indicator menus (a big number)
52 cacheBuffer: 1073741823
52 cacheBuffer: 1073741823
qml/Panel/Panel.qml+1
@@ -278,6 +278,7 @@ Item {
278 id: actionItem
278 id: actionItem
279 property int ownIndex: index
279 property int ownIndex: index
280 objectName: "appMenuItem"+index
280 objectName: "appMenuItem"+index
281+ enabled: model.sensitive
281
282
282 width: _title.width + units.gu(2)
283 width: _title.width + units.gu(2)
283 height: parent.height
284 height: parent.height
qml/Panel/PanelBar.qml+16
@@ -44,6 +44,22 @@ Item {
44 row.selectItemAt(mapped.x);
44 row.selectItemAt(mapped.x);
45 }
45 }
46
46
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+
47 function setCurrentItemIndex(index) {
63 function setCurrentItemIndex(index) {
48 if (!expanded) {
64 if (!expanded) {
49 row.resetCurrentItem();
65 row.resetCurrentItem();
qml/Panel/PanelItemRow.qml+32−6
@@ -96,31 +96,57 @@ Item {
96 row.currentIndex = -1;
96 row.currentIndex = -1;
97 }
97 }
98
98
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+
99 function setCurrentItemIndex(index) {
117 function setCurrentItemIndex(index) {
100 for (var i = 0; i < row.contentItem.children.length; i++) {
118 for (var i = 0; i < row.contentItem.children.length; i++) {
101 var item = row.contentItem.children[i];
119 var item = row.contentItem.children[i];
102− if (item.hasOwnProperty("ownIndex") && item.ownIndex === index) {
120+ if (item.hasOwnProperty("ownIndex") && item.ownIndex === index && item.enabled) {
121+ if (currentItem !== item) {
103− if (currentItem !== item) row.currentIndex = index;
122+ row.currentIndex = index;
104− break;
123+ }
124+ return true;
105 }
125 }
106 }
126 }
127+ return false;
107 }
128 }
108
129
109 function selectItemAt(lateralPosition) {
130 function selectItemAt(lateralPosition) {
110 var item = indicatorAt(lateralPosition, 0);
131 var item = indicatorAt(lateralPosition, 0);
111− if (item && item.opacity > 0) {
132+ if (item && item.opacity > 0 && item.enabled) {
112 row.currentIndex = item.ownIndex;
133 row.currentIndex = item.ownIndex;
113 } else {
134 } else {
114 // Select default item.
135 // Select default item.
115 var searchIndex = lateralPosition >= width ? row.count - 1 : 0;
136 var searchIndex = lateralPosition >= width ? row.count - 1 : 0;
116
137
117 for (var i = 0; i < row.contentItem.children.length; i++) {
138 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+ {
119 item = row.contentItem.children[i];
143 item = row.contentItem.children[i];
120 break;
144 break;
121 }
145 }
122 }
146 }
147+ if (item && currentItem !== item) {
123− if (currentItem !== item) row.currentIndex = item ? item.ownIndex : -1;
148+ row.currentIndex = item.ownIndex;
149+ }
124 }
150 }
125 }
151 }
126
152
qml/Panel/PanelMenu.qml+2−2
@@ -143,10 +143,10 @@ Showable {
143
143
144 Keys.onPressed: {
144 Keys.onPressed: {
145 if (event.key === Qt.Key_Left) {
145 if (event.key === Qt.Key_Left) {
146− bar.setCurrentItemIndex(bar.currentItemIndex - 1);
146+ bar.selectPreviousItem();
147 event.accepted = true;
147 event.accepted = true;
148 } else if (event.key === Qt.Key_Right) {
148 } else if (event.key === Qt.Key_Right) {
149− bar.setCurrentItemIndex(bar.currentItemIndex + 1);
149+ bar.selectNextItem();
150 event.accepted = true;
150 event.accepted = true;
151 } else if (event.key === Qt.Key_Escape) {
151 } else if (event.key === Qt.Key_Escape) {
152 root.hide();
152 root.hide();
qml/Panel/PanelMenuPage.qml+1−1
@@ -63,7 +63,7 @@ PageStack {
63 if (model) {
63 if (model) {
64 push(pageComponent, { "menuModel": model });
64 push(pageComponent, { "menuModel": model });
65 }
65 }
66− } else {
66+ } else if (root.currentPage) {
67 root.currentPage.reset();
67 root.currentPage.reset();
68 }
68 }
69 }
69 }
tests/qmltests/ApplicationMenus/tst_MenuBar.qml+24
@@ -226,6 +226,30 @@ Item {
226 keyRelease(data.tag, Qt.AltModifier, 100);
226 keyRelease(data.tag, Qt.AltModifier, 100);
227 }
227 }
228
228
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+
229 function test_menuActivateClosesMenu() {
253 function test_menuActivateClosesMenu() {
230 menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
254 menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
231 var priv = findInvisibleChild(menuBar, "d");
255 var priv = findInvisibleChild(menuBar, "d");
tests/qmltests/Panel/tst_Panel.qml+24
@@ -872,5 +872,29 @@ PanelTest {
872 keyClick(Qt.Key_Enter);
872 keyClick(Qt.Key_Enter);
873 compare(aboutToShowCalledSpy.count, 1);
873 compare(aboutToShowCalledSpy.count, 1);
874 }
874 }
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+ }
875 }
899 }
876}
900}