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

commita7fc9531c4c536308fb8e06407d348aa27b211bb authorAlbert Astals Cid <albert.astals@canonical.com> dateWed 8 Mar 2017, 10:16 (10 years ago) parentcd7f835
6 files changed+54−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
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
@@ -272,6 +272,7 @@ Item {
272272 id: actionItem
273273 property int ownIndex: index
274274 objectName: "appMenuItem"+index
275+ enabled: model.sensitive
275276
276277 width: _title.width + units.gu(2)
277278 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 }