on xenial help sign in
Signal aboutToShow (LP: #1664578)

Approved by: Lukáš Tinkl, Unity8 CI Bot

commitc196bf9e89e9a498b729c55ea798469aaeaa2b14 authorAlbert Astals Cid <albert.astals@canonical.com> dateTue 21 Mar 2017, 10:55 (10 years ago) parentbdc952b46d9032
11 files changed+134−12
debian/control+1−1 qml/ApplicationMenus/MenuBar.qml+3−1 qml/ApplicationMenus/MenuPopup.qml+3−1 qml/Panel/Panel.qml+7 qml/Panel/PanelMenu.qml+1 qml/Panel/PanelMenuPage.qml+1 tests/mocks/QMenuModel/unitymenumodel.cpp+5 tests/mocks/QMenuModel/unitymenumodel.h+2 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+43 tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+34−9 tests/qmltests/Panel/tst_Panel.qml+34
debian/control+1−1
@@ -28,7 +28,7 @@ Build-Depends: cmake,
2828 liblightdm-qt5-3-dev,
2929 libpam0g-dev,
3030 libpulse-dev,
31− libqmenumodel-dev (>= 0.2.11),
31+ libqmenumodel-dev (>= 0.2.12),
3232 libqt5svg5-dev,
3333 libqt5xmlpatterns5-dev,
3434 libsystemsettings-dev,
qml/ApplicationMenus/MenuBar.qml+3−1
@@ -136,6 +136,7 @@ Item {
136136
137137 function show() {
138138 if (!__popup) {
139+ root.unityMenuModel.aboutToShow(visualItem.__ownIndex);
139140 __popup = menuComponent.createObject(root,
140141 {
141142 objectName: visualItem.objectName + "-menu",
@@ -146,7 +147,8 @@ Item {
146147 __popup.reset();
147148 __popup.childActivated.connect(dismiss);
148149 // force the current item to be the newly popped up menu
149− } else {
150+ } else if (!__popup.visible) {
151+ root.unityMenuModel.aboutToShow(visualItem.__ownIndex);
150152 __popup.show();
151153 }
152154 d.currentItem = visualItem;
qml/ApplicationMenus/MenuPopup.qml+3−1
@@ -302,6 +302,7 @@ UbuntuShape {
302302
303303 if (hasSubmenu) {
304304 if (!popup) {
305+ root.unityMenuModel.aboutToShow(__ownIndex);
305306 var model = root.unityMenuModel.submenu(__ownIndex);
306307 popup = submenuComponent.createObject(focusScope, {
307308 objectName: parent.objectName + "-",
@@ -323,7 +324,8 @@ UbuntuShape {
323324 popup = null;
324325 root.childActivated();
325326 });
326− } else if (popup) {
327+ } else if (!popup.visible) {
328+ root.unityMenuModel.aboutToShow(__ownIndex);
327329 popup.visible = true;
328330 }
329331 } else {
qml/Panel/Panel.qml+7
@@ -296,6 +296,13 @@ Item {
296296 }
297297
298298 pageDelegate: PanelMenuPage {
299+ readonly property bool isCurrent: modelIndex == __applicationMenus.currentMenuIndex
300+ onIsCurrentChanged: {
301+ if (isCurrent && menuModel) {
302+ menuModel.aboutToShow(modelIndex);
303+ }
304+ }
305+
299306 menuModel: __applicationMenus.model
300307 submenuIndex: modelIndex
301308
qml/Panel/PanelMenu.qml+1
@@ -46,6 +46,7 @@ Showable {
4646 readonly property bool fullyClosed: unitProgress == 0
4747 readonly property alias expanded: bar.expanded
4848 readonly property int barWidth: Math.min(bar.width, bar.implicitWidth)
49+ readonly property alias currentMenuIndex: bar.currentItemIndex
4950
5051 signal showTapped()
5152
qml/Panel/PanelMenuPage.qml+1
@@ -192,6 +192,7 @@ PageStack {
192192 if (item.hasOwnProperty("clicked")) {
193193 item.clicked.connect(function() {
194194 if (model.hasSubmenu) {
195+ page.menuModel.aboutToShow(modelIndex);
195196 root.push(pageComponent, {
196197 "isSubmenu": true,
197198 "title": model.label.replace(/_|&/, ""),
tests/mocks/QMenuModel/unitymenumodel.cpp+5
@@ -273,6 +273,11 @@ void UnityMenuModel::activate(int row, const QVariant&)
273273 Q_EMIT activated(rd[roleNames()[ActionRole]].toString());
274274}
275275
276+void UnityMenuModel::aboutToShow(int index)
277+{
278+ Q_EMIT aboutToShowCalled(index);
279+}
280+
276281void UnityMenuModel::changeState(int, const QVariant&)
277282{
278283}
tests/mocks/QMenuModel/unitymenumodel.h+2
@@ -73,6 +73,7 @@ public:
7373 Q_INVOKABLE QVariant get(int row, const QByteArray &role);
7474
7575 Q_INVOKABLE void activate(int index, const QVariant& parameter = QVariant());
76+ Q_INVOKABLE void aboutToShow(int index);
7677 Q_INVOKABLE void changeState(int index, const QVariant& parameter);
7778
7879 void registerAction(UnityMenuAction* action);
@@ -87,6 +88,7 @@ Q_SIGNALS:
8788
8889 // Internal mock usage
8990 void modelDataChanged();
91+ void aboutToShowCalled(int index);
9092
9193 void activated(const QString& action);
9294
tests/qmltests/ApplicationMenus/tst_MenuBar.qml+43
@@ -76,6 +76,12 @@ Item {
7676 signalName: "activated"
7777 }
7878
79+ SignalSpy {
80+ id: aboutToShowCalledSpy
81+ target: menuBackend
82+ signalName: "aboutToShowCalled"
83+ }
84+
7985 UnityTestCase {
8086 id: testCase
8187 name: "MenuBar"
@@ -115,6 +121,43 @@ Item {
115121 compare(menuItem0.popupVisible, true, "Popup should be visible");
116122 }
117123
124+ function test_aboutToShow() {
125+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0, "menu");
126+ wait(50) // wait for row to build
127+ var priv = findInvisibleChild(menuBar, "d");
128+
129+ var menuItem0 = findChild(menuBar, "menuBar-item0");
130+ var menuItem1 = findChild(menuBar, "menuBar-item1");
131+
132+ aboutToShowCalledSpy.clear();
133+ menuItem0.show();
134+ compare(aboutToShowCalledSpy.count, 1);
135+
136+ menuItem0.show();
137+ // It's already shown so nothing happens
138+ compare(aboutToShowCalledSpy.count, 1);
139+
140+ menuItem0.hide();
141+ menuItem0.show();
142+ compare(aboutToShowCalledSpy.count, 2);
143+
144+ menuItem0.dismiss();
145+ menuItem0.show();
146+ compare(aboutToShowCalledSpy.count, 3);
147+
148+ menuItem1.show();
149+ compare(aboutToShowCalledSpy.count, 4);
150+
151+ menuItem0.show();
152+ compare(aboutToShowCalledSpy.count, 5);
153+
154+ compare(aboutToShowCalledSpy.signalArguments[0][0], 0);
155+ compare(aboutToShowCalledSpy.signalArguments[1][0], 0);
156+ compare(aboutToShowCalledSpy.signalArguments[2][0], 0);
157+ compare(aboutToShowCalledSpy.signalArguments[3][0], 1);
158+ compare(aboutToShowCalledSpy.signalArguments[4][0], 0);
159+ }
160+
118161 function test_keyboardNavigation_RightKeySelectsNextMenuItem(data) {
119162 menuBackend.modelData = appMenuData.generateTestData(3,3,0,0, "menu");
120163 var priv = findInvisibleChild(menuBar, "d");
tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+34−9
@@ -59,18 +59,13 @@ Item {
5959 }}
6060 ]
6161 }
62−
63− Binding {
64− target: activatedSpy
65− property: "target"
66− value: unityMenuModel
67− }
6862 }
6963 }
7064
7165 SignalSpy {
72− id: activatedSpy
73− signalName: "activated"
66+ id: aboutToShowCalledSpy
67+ target: loader.item ? loader.item.unityMenuModel : undefined
68+ signalName: "aboutToShowCalled"
7469 }
7570
7671 UnityTestCase {
@@ -88,7 +83,6 @@ Item {
8883 function cleanup() {
8984 menu.reset();
9085 wait(100); // let the page dismiss
91− activatedSpy.clear();
9286
9387 loader.active = false;
9488 tryCompare(loader, "item", null);
@@ -194,6 +188,37 @@ Item {
194188 compare(priv.currentItem, item0, "CurrentItem should have moved to item 2");
195189 }
196190
191+ function test_aboutToShow() {
192+ menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
193+
194+ var item0 = findChild(menu, "menu-item0");
195+ var item1 = findChild(menu, "menu-item1");
196+ var item2 = findChild(menu, "menu-item2");
197+
198+ aboutToShowCalledSpy.clear();
199+
200+ mouseMove(item0, item0.width/2, item0.height/2);
201+ tryCompare(aboutToShowCalledSpy, "count", 1);
202+
203+ mouseMove(item1, item0.width/2, item0.height/2);
204+ tryCompare(aboutToShowCalledSpy, "count", 2);
205+
206+ mouseMove(item2, item0.width/2, item0.height/2);
207+ tryCompare(aboutToShowCalledSpy, "count", 3);
208+
209+ mouseMove(item0, item0.width/2, item0.height/2);
210+ tryCompare(aboutToShowCalledSpy, "count", 4);
211+
212+ item0.item.trigger();
213+ // it's already visible
214+ tryCompare(aboutToShowCalledSpy, "count", 4);
215+
216+ compare(aboutToShowCalledSpy.signalArguments[0][0], 0);
217+ compare(aboutToShowCalledSpy.signalArguments[1][0], 1);
218+ compare(aboutToShowCalledSpy.signalArguments[2][0], 2);
219+ compare(aboutToShowCalledSpy.signalArguments[3][0], 0);
220+ }
221+
197222 function test_keyboardNavigation_RightKeyEntersSubMenu() {
198223 menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
199224
tests/qmltests/Panel/tst_Panel.qml+34
@@ -57,6 +57,11 @@ PanelTest {
5757 color: "darkgrey"
5858 }
5959
60+ SignalSpy {
61+ id: aboutToShowCalledSpy
62+ signalName: "aboutToShowCalled"
63+ }
64+
6065 RowLayout {
6166 anchors.fill: parent
6267 anchors.margins: units.gu(1)
@@ -838,5 +843,34 @@ PanelTest {
838843 keyClick(Qt.Key_Escape);
839844 tryCompare(panel.indicators, "fullyClosed", true);
840845 }
846+
847+ function test_aboutToShowMenu() {
848+ waitForRendering(panel);
849+
850+ aboutToShowCalledSpy.target = panel.applicationMenus.model
851+ aboutToShowCalledSpy.clear();
852+
853+ var indicatorsBar = findChild(panel.applicationMenus, "indicatorsBar");
854+
855+ PanelState.title = "Fake Title"
856+ pullDownApplicationsMenu();
857+ compare(aboutToShowCalledSpy.count, 1);
858+
859+ keyClick(Qt.Key_Right);
860+ tryCompare(indicatorsBar, "currentItemIndex", 1);
861+ compare(aboutToShowCalledSpy.count, 2);
862+
863+ compare(aboutToShowCalledSpy.signalArguments[0][0], 0);
864+ compare(aboutToShowCalledSpy.signalArguments[1][0], 1);
865+
866+ keyClick(Qt.Key_Tab);
867+ keyClick(Qt.Key_Tab);
868+
869+ aboutToShowCalledSpy.target = panel.applicationMenus.model.submenu(1);
870+ aboutToShowCalledSpy.clear();
871+
872+ keyClick(Qt.Key_Enter);
873+ compare(aboutToShowCalledSpy.count, 1);
874+ }
841875 }
842876}