Merge lp:~unity-team/unity8/launcher-sizing into lp:unity8

Proposed by Michał Sawicz
Status: Superseded
Proposed branch: lp:~unity-team/unity8/launcher-sizing
Merge into: lp:unity8
Prerequisite: lp:~unity-team/unity8/launcher-updates
Diff against target: 1164 lines (+406/-110)
12 files modified
data/com.canonical.Unity8.gschema.xml (+11/-0)
qml/Launcher/Launcher.qml (+33/-11)
qml/Launcher/LauncherDelegate.qml (+8/-12)
qml/Launcher/LauncherPanel.qml (+34/-34)
qml/Shell.qml (+18/-1)
qml/Stages/AbstractStage.qml (+2/-0)
qml/Stages/DesktopStage.qml (+14/-11)
qml/Stages/WindowResizeArea.qml (+3/-2)
tests/mocks/GSettings.1.0/fake_gsettings.cpp (+64/-0)
tests/mocks/GSettings.1.0/fake_gsettings.h (+18/-0)
tests/qmltests/Launcher/tst_Launcher.qml (+110/-26)
tests/qmltests/tst_Shell.qml (+91/-13)
To merge this branch: bzr merge lp:~unity-team/unity8/launcher-sizing
Reviewer Review Type Date Requested Status
Lukáš Tinkl (community) Approve
Albert Astals Cid (community) Abstain
PS Jenkins bot (community) continuous-integration Needs Fixing
Unity8 CI Bot continuous-integration Needs Fixing
Michael Terry Pending
Michał Sawicz Pending
Daniel d'Andrada Pending
Review via email: mp+286396@code.launchpad.net

This proposal supersedes a proposal from 2015-12-10.

This proposal has been superseded by a proposal from 2016-02-25.

Commit message

Make launcher scalable, allow it locking

Description of the change

* Are there any related MPs required for this MP to build/function as expected? Please list.

 - see prereq

 * Did you perform an exploratory manual test run of your code change and any related functionality?
yes
 * Did you make sure that your branch does not contain spurious tags?
y
 * If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
n/a
 * If you changed the UI, has there been a design review?
y

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2065
http://jenkins.qa.ubuntu.com/job/unity8-ci/6911/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5697
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/326/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1622
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/325
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1517
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1517
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/324
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/323
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4423
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5710
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5710/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/25935
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/125/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/325
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/325/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/25937

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6911/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

Some tests failing:

qmltestrunner.Shell::test_focusAppFromLauncherExitsSpread
qmltestrunner.Shell::test_progressiveAutoScrolling
qmltestrunner.Shell::test_superTabToCycleLauncher

review: Needs Fixing
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

One minor comment inline, fix the gsettings description

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote : Posted in a previous version of this proposal

Text conflict in tests/qmltests/tst_Shell.qml
1 conflicts encountered.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2071
http://jenkins.qa.ubuntu.com/job/unity8-ci/6952/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5789
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/367/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1663
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/366
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1558
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1558
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/365
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/364
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4477
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5802
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5802/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26068
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/136/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/366
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/366/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26069

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6952/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2073
http://jenkins.qa.ubuntu.com/job/unity8-ci/6958/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5800
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/373/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1669
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/372
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1564
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1564
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/371
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/370
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4486
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5813
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5813/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26085
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/141/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/372
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/372/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26084

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6958/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

I know this may be bending too far backwards, but have you considered re-using the unity7 gsettings locations for the launcher?

The org.compiz.unityshell schema, installed by the unity-schemas package, has a launcher-hide-mode key and a icon-size key. The former should work just fine for our needs. But the icon-size is specified in pixels. So if we used that key, maybe we'd do some clever (or dumb!) converting.

I know it's cleaner to use our own schema. But compatibility between the two DEs (both of which we make!) would be nice. But I'm not going to push very hard for it. :)

===

In Launcher.qml, when lockedVisible changes, this code immediately calls hide(). Do you want to trigger the dismiss timer instead? That way panel.preventHiding gets respected. And just calling hide() assumes that lockedVisible is tied to autohideEnabled. Which it is... But feels weird to have those be overlapping states and have Shell.qml be the one combining them.

How would you feel about renaming lockedVisible to something like visibleByDefault and just having it be set to "scenario == desktop"? And then having Launcher combine that state and autohideEnabled to do the right thing.

The current way is fine too. But maybe just use the dismiss trigger instead of hide() at least.

===

I also tested this on my phone and couldn't pull the launcher out. It just didn't come out when I swiped from the left... I probably did something wrong... Maybe I should do a fresh build, I just moved qml files into place (no c++ changes here or in pre-req, right?) since the debs from jenkins are 404 now. Have you tested this MP recently?

review: Needs Information
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

Oh, duh. The gsettings schema. Need to make a deb I guess.

Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

OK... Now I see that autohideLauncher is in fact a separate property from Launcher.autohideEnabled. That confusion on my part drove me talking about the overlapping states above. I guess ignore that piece then.

Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

Maybe move the launcherSettings object into the main Shell object instead of the Launcher, since it is not a launcher-specific object?

The old GSettings object seems to have moved into a Unity8Settings override-able object on the OrientedShell... I guess someone figured that was easier to mock than our existing GSettings mocks? But that means it's not accessible from the base Shell now, hence why you needed to add your own GSettings object.

:(

===

Neither the pips nor the badge text changes size with the launcher icons. Is that intentional?

===

I'm getting "Damper::maxDelta must be a positive number. Aborted" when running xvfbtestLauncher/Shell. But I also get that on the Dash tests. I don't think that's related. Outside of xvfb works fine.

Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

re re-using the unity7 schema: I did try to keep compatibility in the launcher for a long time. However, given the drastic changes of how we work with app ids now, at some point I could not reuse the favorites key in there any more. Also this branch's requirements were quite different at some point, in a sense that we'd need to store different size configs for different usage modes, this might come back as a design request at any point. Last but not least, the px vs GU issue is another one why I think reusing is not the best idea. Even if I'd convert it, the setting is stored in pixels and will break if the use switches to a screen with different PX/GU.

===

re: hide() vs dismissTimer. using dismissTimer would cause the launcher to wait for some seconds before hiding when the user changes the setting in systemsettings, which I think would be a bit weird (unity7 hides it immediately on setting change too). You do have a point that if the user would have the mouse hovered on the launcher while changing the setting it would hide despite the user "interacting" with it. However, is it really a use case that the user interacts with the mouse on the launcher and uses, touch or cmdline to make the launcher hide at the same time? Hence my decision to go for hide() immediately, so the user gets immediate feedback when clicking on the (yet to be added in settings) checkbox.

===

re requiring a .deb for testing. I usually copy the schema to the device and call "sudo glib-compile-schemas /usr/share/glib-2.0/schemas" myself.

===

re moving GSettings around, yes, Daniel keeps on moving those things so he can mock them in QML instead of using the GSettingsController to control the mock... I think we should remove the Unity8Settings again, given that the only thing that we actually mock with that are already supported by our GSettingsControllerQML stuff. Also the workaround in Unity8Settings is not required any more as the fix for that landed by now. Given that touches quite some places tho, I'd vote for doing that in a different branch.

Anyhow, I've moved the GSettings object out of the launcher now and called it settings.

===

re pip and count emblems not scaling, yes, intentional. You couldn't read them any more at the smalles level and they'd be super huge on the biggest. I talked with design about that. we agreed to not scale them.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2075
http://jenkins.qa.ubuntu.com/job/unity8-ci/6979/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5863
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/394/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1689
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/392
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1584
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1584
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/391
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/390
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4522
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5874
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5874/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26228
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/155/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/392
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/392/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26227

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6979/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

Alright then, sounds sensible. :)

I like the code changes, but looks like we have new failures in testShell at least? I get 15 new failures locally.

Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

fixed the tests.

Please note that I had to merge lp:~dandrader/unity8/fixDragHandleTest in order to make xvfbtestShell work at all. As I already have a prereq, that diff will show up here too. It should vanish after the next landing.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2078
http://jenkins.qa.ubuntu.com/job/unity8-ci/7033/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5973
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/448/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1738
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/441
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1633
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1633
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/440
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/439
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4617
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5984
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5984/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26502
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/198/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/446
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/446/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26503

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7033/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

I also see a failure in tst_Launcher::test_clickFlick in jenkins, but I don't see it locally. Does that pass/fail for you?

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2079
http://jenkins.qa.ubuntu.com/job/unity8-ci/7036/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5976
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/451/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1741
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/444
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1636
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1636
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/443
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/442
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4620
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5987
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5987/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26516
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/201/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/449
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/449/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26518

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7036/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

Hrm. Jenkins failure went away... And I can't see it locally, so fine. :) Approved, thanks!

review: Approve
Revision history for this message
Albert Astals Cid (aacid) wrote : Posted in a previous version of this proposal

Text conflict in qml/Launcher/Launcher.qml
Text conflict in qml/Launcher/LauncherPanel.qml
2 conflicts encountered.

Was already top approved.

review: Needs Fixing
Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> Text conflict in qml/Launcher/Launcher.qml
> Text conflict in qml/Launcher/LauncherPanel.qml
> 2 conflicts encountered.
>
> Was already top approved.

merged

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2080
http://jenkins.qa.ubuntu.com/job/unity8-ci/7059/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/6013
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/474/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1764
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/467
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1659
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1659
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/466
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/465
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4645
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6024
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6024/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26616
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/219/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/472
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/472/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26617

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7059/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

PASSED: Continuous integration, rev:2080
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/22/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/22/rebuild

review: Approve (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

Looks good again, and CI bot says good!

Revision history for this message
Albert Astals Cid (aacid) wrote : Posted in a previous version of this proposal

Something went wrong

file:///home/tsdgeos_work/phablet/unity8/launcher-sizing/tests/qmltests/Launcher/tst_Launcher.qml:313:18: Duplicate method name
             function assertFocusOnIndex(index) {

review: Needs Fixing
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

Found a small bug:

1. Alt+F1 to open the keyboard navigation
2. Press Down to highlight an item
3. Press Right to open the quicklist
4. Launch the app
5. The (keyboard) focus ring doesn't go away

review: Needs Fixing
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

Hmm yes and no, it becomes obvious here now that the launcher stays locked visible in the desktop mode; tbh I don't recall seeing this when testing just the launcher-updates branch before

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

When switching between windows with Alt+Tab (while the launcher is locked visible), the launcher flashes/flickers

review: Needs Fixing
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

PASSED: Continuous integration, rev:2081
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/66/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/66/rebuild

review: Approve (continuous-integration)
Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> Found a small bug:
>
> 1. Alt+F1 to open the keyboard navigation
> 2. Press Down to highlight an item
> 3. Press Right to open the quicklist
> 4. Launch the app
> 5. The (keyboard) focus ring doesn't go away
> review: Needs Fixing
> Reply
> Michael Terry (mterry) wrote 1 minute ago: #

> That's probably a bug in the pre-req: https://code.launchpad.net/~mzanetti/unity8/launcher-updates
> /+merge/278567

Indeed, fixed in the prereq and merged this

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2081
http://jenkins.qa.ubuntu.com/job/unity8-ci/7065/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/6023
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/480/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1770
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/473
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1665
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1665
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/472
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/471
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4650
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6034
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6034/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26647
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/224/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/478
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/478/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26649

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7065/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) : Posted in a previous version of this proposal
review: Abstain (the broken merge is gone)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

PASSED: Continuous integration, rev:2082
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/72/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/72/rebuild

review: Approve (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2083
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/74/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/74/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

When having a fullscreen app (like camera or a webbrowser windows), the launcher should imho hide regardless of the visible-locked preference, just like the top panel does.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2083
http://jenkins.qa.ubuntu.com/job/unity8-ci/7070/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/6030/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/485/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1775
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/478
    FAILURE: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1670/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1670
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/477
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/476
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4657/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6041
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6041/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26662
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/229/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/483
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/483/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26663

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7070/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

PASSED: Continuous integration, rev:2084
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/77/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/77/rebuild

review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2084
http://jenkins.qa.ubuntu.com/job/unity8-ci/7073/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/6035
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/488/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1778
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/481
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1673
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1673
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/480
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/479
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4662
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6046
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6046/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26675
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/232/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/486
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/486/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26674

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7073/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

PASSED: Continuous integration, rev:2085
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/79/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/79/rebuild

review: Approve (continuous-integration)
Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> When having a fullscreen app (like camera or a webbrowser windows), the
> launcher should imho hide regardless of the visible-locked preference, just
> like the top panel does.

done

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2085
http://jenkins.qa.ubuntu.com/job/unity8-ci/7075/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/6038
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/490/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1780
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/483
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1675
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1675
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/482
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/481
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4665
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6049
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6049/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26686
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/234/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/488
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/488/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26688

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7075/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2086
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

The flickering and fullscreen is fixed, great

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

Please remove the spurious bzr tags, otherwise no more objections

review: Needs Fixing
Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> Please remove the spurious bzr tags, otherwise no more objections

done. must've been merged in after the initial proposal

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

LGTM, works fine now, minus some some havoc in LauncherModel (unrelated to this branch), gonna file a bug about it

* Did you perform an exploratory manual test run of the code change and any related functionality?

Yes!

* Did CI run pass? If not, please explain why.

Yes (all the relevant tests passing locally)

* Did you make sure that the branch does not contain spurious tags?

Yes

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2086
http://jenkins.qa.ubuntu.com/job/unity8-ci/7077/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/6041
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/492/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1782
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/485
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1677
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1677
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/484
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/483
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-touch/4668
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6052
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/6052/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26705
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-touch/236/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/490
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/490/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/26704

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/7077/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2086
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2086
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2086
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/89/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote : Posted in a previous version of this proposal

Note: this was already top approved, re-approve after merge

Text conflict in qml/Components/PhysicalKeysMapper.qml
Text conflict in qml/Launcher/Launcher.qml
Text conflict in tests/qmltests/tst_Shell.qml
3 conflicts encountered.

review: Needs Fixing
Revision history for this message
Albert Astals Cid (aacid) wrote : Posted in a previous version of this proposal

Merges now, re-top-approving

review: Abstain
Revision history for this message
Michał Sawicz (saviq) wrote : Posted in a previous version of this proposal

I don't think "always-launcher" is as easy as resizing the desktop stage, it results in fullscreen^W apps moving about:

http://imgur.com/a/5wxlt

Non-fullscreen apps should probably get margins instead of the whole stage being moved about.

I'd vote for leaving the always-launcher feature out from this MP.

review: Needs Fixing
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2089
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/288/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity8-1-ci/288/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote : Posted in a previous version of this proposal

- panel.dismissTimer.restart()
+ dismissTimer.restart()

Is that right?

review: Needs Information
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

qml/Launcher/Launcher.qml:98: ReferenceError: dismissTimer is not defined

Revision history for this message
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal

Why to we need this new intermediate (id: stageContainer) Item in DesktopStage.qml?

review: Needs Information
Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> Why to we need this new intermediate (id: stageContainer) Item in
> DesktopStage.qml?

because the area for the apps needs to be smaller when the launcher is always visible. that said, this might not be good enough yet.

Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> - panel.dismissTimer.restart()
> + dismissTimer.restart()
>
> Is that right?

> qml/Launcher/Launcher.qml:98: ReferenceError: dismissTimer is not defined

bad merge, thanks. fixed

Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal

On 10/02/2016 14:31, Michael Zanetti wrote:
>> Why to we need this new intermediate (id: stageContainer) Item in
>> DesktopStage.qml?
> because the area for the apps needs to be smaller when the launcher is always visible. that said, this might not be good enough yet.

But the leftMargin is not being applied to it, but to appContainer instead.

Revision history for this message
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal

> On 10/02/2016 14:31, Michael Zanetti wrote:
> >> Why to we need this new intermediate (id: stageContainer) Item in
> >> DesktopStage.qml?
> > because the area for the apps needs to be smaller when the launcher is
> always visible. that said, this might not be good enough yet.
>
>
> But the leftMargin is not being applied to it, but to appContainer instead.

Right. So the inner container is for the margins. As the wallpaper can't have the same margins (it shines through the launcher), it can't be inside that container. The outer is used for snapshotting the whole thing in order to apply blur for the spread background. I guess we could make the background also act as the outer container and with that get rid of one item. Anyways, as I said, this doesn't seem to be good enough for switching between fullscreen and non-fullscreen apps yet. have to rework it a bit.

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

Yes, works good now, even with the spread and fullscreen apps

* Did you perform an exploratory manual test run of the code change and any related functionality?

Yes!

* Did CI run pass? If not, please explain why.

Yes (all the relevant tests passing locally)

* Did you make sure that the branch does not contain spurious tags?

Yes

review: Approve
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) :
review: Abstain
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote :

Re-approving after prereq merge

review: Approve

Unmerged revisions

2092. By Lukáš Tinkl

merge prereq

2091. By Michał Sawicz

Merge lp:~unity-team/unity8/launcher-updates

2090. By Michael Zanetti

merge prereq

2089. By Michael Zanetti

don't resize the whole stage, instead add margins to non fullscreen things

2088. By Michael Zanetti

merge trunk

2087. By Michael Zanetti

merge prereq

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/com.canonical.Unity8.gschema.xml'
2--- data/com.canonical.Unity8.gschema.xml 2015-11-24 17:44:18 +0000
3+++ data/com.canonical.Unity8.gschema.xml 2016-02-19 15:10:34 +0000
4@@ -27,6 +27,17 @@
5 <summary>Maximum push needed to overcome edge barrier</summary>
6 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
7 </key>
8+ <key type="b" name="autohide-launcher">
9+ <default>false</default>
10+ <summary>Autohide the launcher</summary>
11+ <description>This will only be applied in windowed mode. In staged mode, the launcher will always hide.</description>
12+ </key>
13+ <key type="u" name="launcher-width">
14+ <default>8</default>
15+ <range min="6" max="12"/>
16+ <summary>Width of the launcher in grid units.</summary>
17+ <description>Changes the width of the launcher in all usage modes.</description>
18+ </key>
19 </schema>
20
21 <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
22
23=== modified file 'qml/Launcher/Launcher.qml'
24--- qml/Launcher/Launcher.qml 2016-02-19 15:10:33 +0000
25+++ qml/Launcher/Launcher.qml 2016-02-19 15:10:34 +0000
26@@ -25,11 +25,12 @@
27 id: root
28
29 property bool autohideEnabled: false
30+ property bool lockedVisible: false
31 property bool available: true // can be used to disable all interactions
32 property alias inverted: panel.inverted
33 property bool shadeBackground: true // can be used to disable background shade when launcher is visible
34
35- property int panelWidth: units.gu(8)
36+ property int panelWidth: units.gu(10)
37 property int dragAreaWidth: units.gu(1)
38 property int minimizeDistance: units.gu(26)
39 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
40@@ -92,12 +93,24 @@
41 }
42 }
43
44+ onLockedVisibleChanged: {
45+ if (lockedVisible && state == "") {
46+ panel.dismissTimer.stop();
47+ fadeOutAnimation.stop();
48+ switchToNextState("visible")
49+ } else if (!lockedVisible && state == "visible") {
50+ hide();
51+ }
52+ }
53+
54 function hide() {
55 switchToNextState("")
56 }
57
58 function fadeOut() {
59- fadeOutAnimation.start();
60+ if (!root.lockedVisible) {
61+ fadeOutAnimation.start();
62+ }
63 }
64
65 function switchToNextState(state) {
66@@ -172,7 +185,7 @@
67 } else if (panel.highlightIndex >= 0) {
68 launcherApplicationSelected(LauncherModel.get(panel.highlightIndex).appId);
69 }
70- root.state = ""
71+ root.hide();
72 event.accepted = true;
73 root.focus = false;
74 }
75@@ -211,6 +224,13 @@
76 interval: 1
77 property string nextState: ""
78 onTriggered: {
79+ if (root.lockedVisible && nextState == "") {
80+ // Due to binding updates when switching between modes
81+ // it could happen that our request to show will be overwritten
82+ // with a hide request. Rewrite it when we know hiding is not allowed.
83+ nextState = "visible"
84+ }
85+
86 // switching to an intermediate state here to make sure all the
87 // values are restored, even if we were already in the target state
88 root.state = "tmp"
89@@ -256,7 +276,7 @@
90
91 MouseArea {
92 id: launcherDragArea
93- enabled: root.available && (root.state == "visible" || root.state == "visibleTemporary")
94+ enabled: root.available && (root.state == "visible" || root.state == "visibleTemporary") && !root.lockedVisible
95 anchors.fill: panel
96 anchors.rightMargin: -units.gu(2)
97 drag {
98@@ -277,9 +297,10 @@
99 InverseMouseArea {
100 id: closeMouseArea
101 anchors.fill: panel
102- enabled: root.shadeBackground && root.state == "visible"
103+ enabled: root.shadeBackground && root.state == "visible" && (!root.lockedVisible || panel.highlightIndex >= -1)
104 visible: enabled
105 onPressed: {
106+ panel.highlightIndex = -2
107 root.hide();
108 }
109 }
110@@ -288,7 +309,7 @@
111 id: backgroundShade
112 anchors.fill: parent
113 color: "black"
114- opacity: root.shadeBackground && root.state == "visible" ? 0.6 : 0
115+ opacity: root.shadeBackground && root.state == "visible" && !root.lockedVisible ? 0.6 : 0
116
117 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.BriskDuration } }
118 }
119@@ -332,9 +353,9 @@
120 Connections {
121 target: panel.dismissTimer
122 onTriggered: {
123- if (root.autohideEnabled) {
124+ if (root.autohideEnabled && !root.lockedVisible) {
125 if (!panel.preventHiding) {
126- root.state = ""
127+ root.hide();
128 } else {
129 panel.dismissTimer.restart()
130 }
131@@ -345,11 +366,11 @@
132 property bool animate: true
133
134 onApplicationSelected: {
135- root.state = ""
136+ root.hide();
137 launcherApplicationSelected(appId)
138 }
139 onShowDashHome: {
140- root.state = ""
141+ root.hide();
142 root.showDashHome();
143 }
144
145@@ -360,7 +381,8 @@
146 }
147
148 onKbdNavigationCancelled: {
149- root.state = "";
150+ panel.highlightIndex = -2;
151+ root.hide();
152 root.focus = false;
153 }
154
155
156=== modified file 'qml/Launcher/LauncherDelegate.qml'
157--- qml/Launcher/LauncherDelegate.qml 2016-02-19 15:10:33 +0000
158+++ qml/Launcher/LauncherDelegate.qml 2016-02-19 15:10:34 +0000
159@@ -124,7 +124,7 @@
160
161 Item {
162 id: iconItem
163- width: parent.itemWidth + units.gu(1)
164+ width: root.width
165 height: parent.itemHeight + units.gu(1)
166 anchors.centerIn: parent
167
168@@ -142,7 +142,7 @@
169 ProportionalShape {
170 id: iconShape
171 anchors.centerIn: parent
172- width: parent.width - units.gu(2)
173+ width: root.itemWidth
174 aspect: UbuntuShape.DropShadow
175 source: Image {
176 id: iconImage
177@@ -158,7 +158,8 @@
178 anchors {
179 right: parent.right
180 bottom: parent.bottom
181- margins: units.dp(3)
182+ rightMargin: (iconItem.width - root.itemWidth) / 2 - units.dp(2)
183+ margins: units.dp(5)
184 }
185 width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
186 height: units.gu(2)
187@@ -186,16 +187,11 @@
188 id: progressOverlay
189 objectName: "progressOverlay"
190
191- anchors {
192- left: iconItem.left
193- right: iconItem.right
194- verticalCenter: parent.verticalCenter
195- leftMargin: units.gu(1.5)
196- rightMargin: units.gu(1.5)
197- }
198+ anchors.centerIn: parent
199+ width: root.itemWidth * .8
200 height: units.gu(1)
201 visible: root.progress > -1
202- color: UbuntuColors.darkGrey
203+ backgroundColor: UbuntuColors.darkGrey
204 borderSource: "none"
205
206 Item {
207@@ -213,7 +209,7 @@
208 top: parent.top
209 bottom: parent.bottom
210 }
211- color: "white"
212+ backgroundColor: "white"
213 borderSource: "none"
214 width: progressOverlay.width
215 }
216
217=== modified file 'qml/Launcher/LauncherPanel.qml'
218--- qml/Launcher/LauncherPanel.qml 2016-02-19 15:10:33 +0000
219+++ qml/Launcher/LauncherPanel.qml 2016-02-19 15:10:34 +0000
220@@ -53,14 +53,14 @@
221 if (highlightIndex >= launcherListView.count) {
222 highlightIndex = -1;
223 }
224- moveAnimation.moveToIndex(Math.max(highlightIndex, 0));
225+ launcherListView.moveToIndex(Math.max(highlightIndex, 0));
226 }
227 function highlightPrevious() {
228 highlightIndex--;
229 if (highlightIndex <= -2) {
230 highlightIndex = launcherListView.count - 1;
231 }
232- moveAnimation.moveToIndex(Math.max(highlightIndex, 0));
233+ launcherListView.moveToIndex(Math.max(highlightIndex, 0));
234 }
235 function openQuicklist(index) {
236 quickList.open(index);
237@@ -83,13 +83,13 @@
238 Rectangle {
239 objectName: "buttonShowDashHome"
240 width: parent.width
241- height: units.gu(7)
242+ height: width * .9
243 color: UbuntuColors.orange
244 readonly property bool highlighted: root.highlightIndex == -1;
245
246 Image {
247 objectName: "dashItem"
248- width: units.gu(5)
249+ width: parent.width * .6
250 height: width
251 anchors.centerIn: parent
252 source: "graphics/home.png"
253@@ -125,10 +125,8 @@
254 objectName: "launcherListView"
255 anchors {
256 fill: parent
257- topMargin: -extensionSize + units.gu(0.5)
258- bottomMargin: -extensionSize + units.gu(1)
259- leftMargin: units.gu(0.5)
260- rightMargin: units.gu(0.5)
261+ topMargin: -extensionSize + width * .15
262+ bottomMargin: -extensionSize + width * .15
263 }
264 topMargin: extensionSize
265 bottomMargin: extensionSize
266@@ -163,11 +161,11 @@
267 }
268
269 // The height of the area where icons start getting folded
270- property int foldingStartHeight: units.gu(6.5)
271+ property int foldingStartHeight: itemHeight
272 // The height of the area where the items reach the final folding angle
273 property int foldingStopHeight: foldingStartHeight - itemHeight - spacing
274- property int itemWidth: units.gu(7)
275- property int itemHeight: units.gu(6.5)
276+ property int itemWidth: width * .75
277+ property int itemHeight: itemWidth * 15 / 16 + units.gu(1)
278 property int clickFlickSpeed: units.gu(60)
279 property int draggedIndex: dndArea.draggedIndex
280 property real realContentY: contentY - originY + topMargin
281@@ -195,22 +193,24 @@
282
283 UbuntuNumberAnimation {
284 id: moveAnimation
285+ objectName: "moveAnimation"
286 target: launcherListView
287 property: "contentY"
288 function moveTo(contentY) {
289 from = launcherListView.contentY;
290 to = contentY;
291- start();
292+ restart();
293 }
294- function moveToIndex(index) {
295- var itemPosition = index * launcherListView.itemHeight;
296- var height = launcherListView.height - launcherListView.topMargin - launcherListView.bottomMargin
297- var distanceToEnd = index == 0 || index == launcherListView.count - 1 ? 0 : launcherListView.itemHeight
298- if (itemPosition + launcherListView.itemHeight + distanceToEnd > launcherListView.contentY + launcherListView.topMargin + height) {
299- moveAnimation.moveTo(itemPosition + launcherListView.itemHeight - launcherListView.topMargin - height + distanceToEnd);
300- } else if (itemPosition - distanceToEnd < launcherListView.contentY + launcherListView.topMargin) {
301- moveAnimation.moveTo(itemPosition - distanceToEnd - launcherListView.topMargin);
302- }
303+ }
304+ function moveToIndex(index) {
305+ var totalItemHeight = launcherListView.itemHeight + launcherListView.spacing
306+ var itemPosition = index * totalItemHeight;
307+ var height = launcherListView.height - launcherListView.topMargin - launcherListView.bottomMargin
308+ var distanceToEnd = index == 0 || index == launcherListView.count - 1 ? 0 : totalItemHeight
309+ if (itemPosition + totalItemHeight + distanceToEnd > launcherListView.contentY + launcherListView.originY + launcherListView.topMargin + height) {
310+ moveAnimation.moveTo(itemPosition + launcherListView.itemHeight - launcherListView.topMargin - height + distanceToEnd - launcherListView.originY);
311+ } else if (itemPosition - distanceToEnd < launcherListView.contentY - launcherListView.originY + launcherListView.topMargin) {
312+ moveAnimation.moveTo(itemPosition - distanceToEnd - launcherListView.topMargin + launcherListView.originY);
313 }
314 }
315
316@@ -228,7 +228,7 @@
317 itemIndex: index
318 itemHeight: launcherListView.itemHeight
319 itemWidth: launcherListView.itemWidth
320- width: itemWidth
321+ width: parent.width
322 height: itemHeight
323 iconName: model.icon
324 count: model.count
325@@ -277,7 +277,7 @@
326 onAlertingChanged: {
327 if(alerting) {
328 if (!dragging && (launcherListView.peekingIndex === -1 || launcher.visibleWidth > 0)) {
329- moveAnimation.moveToIndex(index)
330+ launcherListView.moveToIndex(index)
331 if (!dragging && launcher.state !== "visible") {
332 peekingAnimation.start()
333 }
334@@ -439,10 +439,8 @@
335
336 // First/last item do the scrolling at more than 12 degrees
337 if (index == 0 || index == launcherListView.count - 1) {
338- if (clickedItem.angle > 12) {
339- launcherListView.flick(0, -launcherListView.clickFlickSpeed);
340- } else if (clickedItem.angle < -12) {
341- launcherListView.flick(0, launcherListView.clickFlickSpeed);
342+ if (clickedItem.angle > 12 || clickedItem.angle < -12) {
343+ launcherListView.moveToIndex(index);
344 } else {
345 root.applicationSelected(LauncherModel.get(index).appId);
346 }
347@@ -450,10 +448,8 @@
348 }
349
350 // the rest launches apps up to an angle of 30 degrees
351- if (clickedItem.angle > 30) {
352- launcherListView.flick(0, -launcherListView.clickFlickSpeed);
353- } else if (clickedItem.angle < -30) {
354- launcherListView.flick(0, launcherListView.clickFlickSpeed);
355+ if (clickedItem.angle > 30 || clickedItem.angle < -30) {
356+ launcherListView.moveToIndex(index);
357 } else {
358 root.applicationSelected(LauncherModel.get(index).appId);
359 }
360@@ -668,7 +664,6 @@
361 onClicked: {
362 quickList.state = "";
363 quickList.focus = false;
364- root.highlightIndex = -2;
365 root.kbdNavigationCancelled();
366 }
367
368@@ -739,16 +734,21 @@
369 case Qt.Key_Left:
370 case Qt.Key_Escape:
371 quickList.selectedIndex = -1;
372- // Falling through intentionally
373+ quickList.focus = false;
374+ quickList.state = ""
375+ event.accepted = true;
376+ break;
377 case Qt.Key_Enter:
378 case Qt.Key_Return:
379 case Qt.Key_Space:
380 if (quickList.selectedIndex >= 0) {
381 LauncherModel.quickListActionInvoked(quickList.appId, quickList.selectedIndex)
382 }
383+ quickList.selectedIndex = -1;
384 quickList.focus = false;
385 quickList.state = ""
386- // Don't consume the event. We want to close the Launcher too, not just the quicklist.
387+ root.kbdNavigationCancelled();
388+ event.accepted = true;
389 break;
390 }
391 }
392
393=== modified file 'qml/Shell.qml'
394--- qml/Shell.qml 2016-02-19 15:10:33 +0000
395+++ qml/Shell.qml 2016-02-19 15:10:34 +0000
396@@ -25,6 +25,7 @@
397 import Unity.Connectivity 0.1
398 import Unity.Launcher 0.1
399 import GlobalShortcut 1.0 // has to be before Utils, because of WindowKeysFilter
400+import GSettings 1.0
401 import Utils 0.1
402 import Powerd 0.1
403 import SessionBroadcast 0.1
404@@ -187,6 +188,11 @@
405 }
406 }
407
408+ GSettings {
409+ id: settings
410+ schema.id: "com.canonical.Unity8"
411+ }
412+
413 Item {
414 id: stages
415 objectName: "stages"
416@@ -343,6 +349,11 @@
417 property: "altTabPressed"
418 value: physicalKeysMapper.altTabPressed
419 }
420+ Binding {
421+ target: applicationsDisplayLoader.item
422+ property: "leftMargin"
423+ value: shell.usageScenario == "desktop" && !settings.autohideLauncher ? launcher.panelWidth: 0
424+ }
425 }
426
427 Tutorial {
428@@ -373,7 +384,11 @@
429 InputMethod {
430 id: inputMethod
431 objectName: "inputMethod"
432- anchors { fill: parent; topMargin: panel.panelHeight }
433+ anchors {
434+ fill: parent
435+ topMargin: panel.panelHeight
436+ leftMargin: launcher.lockedVisible ? launcher.panelWidth : 0
437+ }
438 z: notifications.useModal || panel.indicators.shown || wizard.active ? overlay.z + 1 : overlay.z - 1
439 }
440
441@@ -559,6 +574,8 @@
442 shadeBackground: !tutorial.running
443 superPressed: physicalKeysMapper.superPressed
444 superTabPressed: physicalKeysMapper.superTabPressed
445+ panelWidth: units.gu(settings.launcherWidth)
446+ lockedVisible: shell.usageScenario == "desktop" && !settings.autohideLauncher && !panel.fullscreenMode
447
448 onShowDashHome: showHome()
449 onDash: showDash()
450
451=== modified file 'qml/Stages/AbstractStage.qml'
452--- qml/Stages/AbstractStage.qml 2016-02-19 15:10:33 +0000
453+++ qml/Stages/AbstractStage.qml 2016-02-19 15:10:34 +0000
454@@ -42,6 +42,8 @@
455 property int shellOrientationAngle
456 property bool spreadEnabled: true // If false, animations and right edge will be disabled
457 property bool suspended
458+ // A Stage should paint a wallpaper etc over its full size but not use the margins for window placement
459+ property int leftMargin: 0
460
461 // To be read from outside
462 property var mainApp: null
463
464=== modified file 'qml/Stages/DesktopStage.qml'
465--- qml/Stages/DesktopStage.qml 2016-02-19 15:10:33 +0000
466+++ qml/Stages/DesktopStage.qml 2016-02-19 15:10:34 +0000
467@@ -226,6 +226,7 @@
468 PanelState.dropShadow = false;
469 }
470
471+
472 FocusScope {
473 id: appContainer
474 objectName: "appContainer"
475@@ -297,6 +298,7 @@
476 visible: !visuallyMinimized &&
477 !greeter.fullyShown &&
478 (priv.foregroundMaximizedAppZ === -1 || priv.foregroundMaximizedAppZ <= z) ||
479+ decoratedWindow.fullscreen ||
480 (spread.state == "altTab" && index === spread.highlightedIndex)
481
482 Binding {
483@@ -368,10 +370,10 @@
484 states: [
485 State {
486 name: "fullscreen"; when: decoratedWindow.fullscreen
487- extend: "maximized"
488 PropertyChanges {
489 target: appDelegate;
490- y: -PanelState.panelHeight
491+ x: 0; y: -PanelState.panelHeight
492+ requestedWidth: appContainer.width; requestedHeight: appContainer.height;
493 }
494 },
495 State {
496@@ -388,21 +390,21 @@
497 name: "maximized"; when: appDelegate.maximized && !appDelegate.minimized
498 PropertyChanges {
499 target: appDelegate;
500- x: 0; y: 0;
501- requestedWidth: root.width; requestedHeight: root.height;
502+ x: root.leftMargin; y: 0;
503+ requestedWidth: appContainer.width - root.leftMargin; requestedHeight: appContainer.height;
504 visuallyMinimized: false;
505 visuallyMaximized: true
506 }
507 },
508 State {
509 name: "maximizedLeft"; when: appDelegate.maximizedLeft && !appDelegate.minimized
510- PropertyChanges { target: appDelegate; x: 0; y: PanelState.panelHeight;
511- requestedWidth: root.width/2; requestedHeight: root.height - PanelState.panelHeight }
512+ PropertyChanges { target: appDelegate; x: root.leftMargin; y: PanelState.panelHeight;
513+ requestedWidth: (appContainer.width - root.leftMargin)/2; requestedHeight: appContainer.height - PanelState.panelHeight }
514 },
515 State {
516 name: "maximizedRight"; when: appDelegate.maximizedRight && !appDelegate.minimized
517- PropertyChanges { target: appDelegate; x: root.width/2; y: PanelState.panelHeight;
518- requestedWidth: root.width/2; requestedHeight: root.height - PanelState.panelHeight }
519+ PropertyChanges { target: appDelegate; x: (appContainer.width + root.leftMargin)/2; y: PanelState.panelHeight;
520+ requestedWidth: (appContainer.width - root.leftMargin)/2; requestedHeight: appContainer.height - PanelState.panelHeight }
521 },
522 State {
523 name: "minimized"; when: appDelegate.minimized
524@@ -465,8 +467,9 @@
525 minHeight: units.gu(10)
526 borderThickness: units.gu(2)
527 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
528- screenWidth: root.width
529- screenHeight: root.height
530+ screenWidth: appContainer.width
531+ screenHeight: appContainer.height
532+ leftMargin: root.leftMargin
533
534 onPressed: { ApplicationManager.focusApplication(model.appId) }
535 }
536@@ -523,7 +526,7 @@
537 DesktopSpread {
538 id: spread
539 objectName: "spread"
540- anchors.fill: parent
541+ anchors.fill: appContainer
542 workspace: appContainer
543 focus: state == "altTab"
544 altTabPressed: root.altTabPressed
545
546=== modified file 'qml/Stages/WindowResizeArea.qml'
547--- qml/Stages/WindowResizeArea.qml 2016-02-03 14:00:47 +0000
548+++ qml/Stages/WindowResizeArea.qml 2016-02-19 15:10:34 +0000
549@@ -40,6 +40,7 @@
550 property int defaultHeight: units.gu(50)
551 property int screenWidth: 0
552 property int screenHeight: 0
553+ property int leftMargin: 0
554
555 QtObject {
556 id: priv
557@@ -72,9 +73,9 @@
558 var windowGeometry = windowStateStorage.getGeometry(root.windowId,
559 Qt.rect(target.x, target.y, defaultWidth, defaultHeight));
560
561- target.requestedWidth = Math.min(Math.max(windowGeometry.width, d.minimumWidth), screenWidth);
562+ target.requestedWidth = Math.min(Math.max(windowGeometry.width, d.minimumWidth), screenWidth - root.leftMargin);
563 target.requestedHeight = Math.min(Math.max(windowGeometry.height, d.minimumHeight), root.screenHeight - PanelState.panelHeight);
564- target.x = Math.max(Math.min(windowGeometry.x, root.screenWidth - target.requestedWidth), 0)
565+ target.x = Math.max(Math.min(windowGeometry.x, root.screenWidth - root.leftMargin - target.requestedWidth), root.leftMargin)
566 target.y = Math.max(Math.min(windowGeometry.y, root.screenHeight - target.requestedHeight), PanelState.panelHeight)
567
568 var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal)
569
570=== modified file 'tests/mocks/GSettings.1.0/fake_gsettings.cpp'
571--- tests/mocks/GSettings.1.0/fake_gsettings.cpp 2015-09-29 20:19:56 +0000
572+++ tests/mocks/GSettings.1.0/fake_gsettings.cpp 2016-02-19 15:10:34 +0000
573@@ -22,6 +22,8 @@
574
575 GSettingsControllerQml::GSettingsControllerQml()
576 : m_usageMode("Staged")
577+ , m_autohideLauncher(false)
578+ , m_launcherWidth(8)
579 {
580 }
581
582@@ -88,6 +90,32 @@
583 }
584 }
585
586+bool GSettingsControllerQml::autohideLauncher() const
587+{
588+ return m_autohideLauncher;
589+}
590+
591+void GSettingsControllerQml::setAutohideLauncher(bool autohideLauncher)
592+{
593+ if (m_autohideLauncher != autohideLauncher) {
594+ m_autohideLauncher = autohideLauncher;
595+ Q_EMIT autohideLauncherChanged(autohideLauncher);
596+ }
597+}
598+
599+int GSettingsControllerQml::launcherWidth() const
600+{
601+ return m_launcherWidth;
602+}
603+
604+void GSettingsControllerQml::setLauncherWidth(int launcherWidth)
605+{
606+ if (m_launcherWidth != launcherWidth) {
607+ m_launcherWidth = launcherWidth;
608+ Q_EMIT launcherWidthChanged(launcherWidth);
609+ }
610+}
611+
612 GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
613 }
614
615@@ -129,6 +157,10 @@
616 this, &GSettingsQml::lockedOutTimeChanged);
617 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::lifecycleExemptAppidsChanged,
618 this, &GSettingsQml::lifecycleExemptAppidsChanged);
619+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::autohideLauncherChanged,
620+ this, &GSettingsQml::autohideLauncherChanged);
621+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::launcherWidthChanged,
622+ this, &GSettingsQml::launcherWidthChanged);
623 }
624
625 GSettingsSchemaQml * GSettingsQml::schema() const {
626@@ -192,9 +224,41 @@
627 }
628 }
629
630+bool GSettingsQml::autohideLauncher() const
631+{
632+ if (m_schema->id() == "com.canonical.Unity8") {
633+ return GSettingsControllerQml::instance()->autohideLauncher();
634+ } else {
635+ return false;
636+ }
637+}
638+
639+int GSettingsQml::launcherWidth() const
640+{
641+ if (m_schema->id() == "com.canonical.Unity8") {
642+ return GSettingsControllerQml::instance()->launcherWidth();
643+ } else {
644+ return false;
645+ }
646+}
647+
648 void GSettingsQml::setLifecycleExemptAppids(const QStringList &appIds)
649 {
650 if (m_schema->id() == "com.canonical.qtmir") {
651 GSettingsControllerQml::instance()->setLifecycleExemptAppids(appIds);
652 }
653 }
654+
655+void GSettingsQml::setAutohideLauncher(bool autohideLauncher)
656+{
657+ if (m_schema->id() == "com.canonical.Unity8") {
658+ GSettingsControllerQml::instance()->setAutohideLauncher(autohideLauncher);
659+ }
660+}
661+
662+void GSettingsQml::setLauncherWidth(int launcherWidth)
663+{
664+ if (m_schema->id() == "com.canonical.Unity8") {
665+ GSettingsControllerQml::instance()->setLauncherWidth(launcherWidth);
666+ }
667+}
668
669=== modified file 'tests/mocks/GSettings.1.0/fake_gsettings.h'
670--- tests/mocks/GSettings.1.0/fake_gsettings.h 2015-09-29 20:19:56 +0000
671+++ tests/mocks/GSettings.1.0/fake_gsettings.h 2016-02-19 15:10:34 +0000
672@@ -50,6 +50,8 @@
673 Q_PROPERTY(QString usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
674 Q_PROPERTY(qint64 lockedOutTime READ lockedOutTime WRITE setLockedOutTime NOTIFY lockedOutTimeChanged)
675 Q_PROPERTY(QStringList lifecycleExemptAppids READ lifecycleExemptAppids WRITE setLifecycleExemptAppids NOTIFY lifecycleExemptAppidsChanged)
676+ Q_PROPERTY(bool autohideLauncher READ autohideLauncher WRITE setAutohideLauncher NOTIFY autohideLauncherChanged)
677+ Q_PROPERTY(int launcherWidth READ launcherWidth WRITE setLauncherWidth NOTIFY launcherWidthChanged)
678
679 public:
680 GSettingsQml(QObject *parent = nullptr);
681@@ -59,11 +61,15 @@
682 QString usageMode() const;
683 qint64 lockedOutTime() const;
684 QStringList lifecycleExemptAppids() const;
685+ bool autohideLauncher() const;
686+ int launcherWidth() const;
687
688 void setPictureUri(const QString &str);
689 void setUsageMode(const QString &usageMode);
690 void setLockedOutTime(qint64 timestamp);
691 void setLifecycleExemptAppids(const QStringList &appIds);
692+ void setAutohideLauncher(bool autohideLauncher);
693+ void setLauncherWidth(int launcherWidth);
694
695 Q_SIGNALS:
696 void schemaChanged();
697@@ -71,6 +77,8 @@
698 void usageModeChanged(const QString&);
699 void lockedOutTimeChanged(qint64);
700 void lifecycleExemptAppidsChanged(const QStringList &);
701+ void autohideLauncherChanged(bool);
702+ void launcherWidthChanged(int launcherWidth);
703
704 private:
705 GSettingsSchemaQml* m_schema;
706@@ -98,11 +106,19 @@
707 QStringList lifecycleExemptAppids() const;
708 Q_INVOKABLE void setLifecycleExemptAppids(const QStringList &appIds);
709
710+ bool autohideLauncher() const;
711+ Q_INVOKABLE void setAutohideLauncher(bool autohideLauncher);
712+
713+ int launcherWidth() const;
714+ Q_INVOKABLE void setLauncherWidth(int launcherWidth);
715+
716 Q_SIGNALS:
717 void pictureUriChanged(const QString&);
718 void usageModeChanged(const QString&);
719 void lockedOutTimeChanged(qint64 timestamp);
720 void lifecycleExemptAppidsChanged(const QStringList&);
721+ void autohideLauncherChanged(bool autohideLauncher);
722+ void launcherWidthChanged(int launcherWidth);
723
724 private:
725 GSettingsControllerQml();
726@@ -111,6 +127,8 @@
727 QString m_usageMode;
728 qint64 m_lockedOutTime;
729 QStringList m_lifecycleExemptAppids;
730+ bool m_autohideLauncher;
731+ int m_launcherWidth;
732
733 static GSettingsControllerQml* s_controllerInstance;
734 QList<GSettingsQml *> m_registeredGSettings;
735
736=== modified file 'tests/qmltests/Launcher/tst_Launcher.qml'
737--- tests/qmltests/Launcher/tst_Launcher.qml 2016-02-19 15:10:33 +0000
738+++ tests/qmltests/Launcher/tst_Launcher.qml 2016-02-19 15:10:34 +0000
739@@ -28,8 +28,8 @@
740 launcher. */
741 Item {
742 id: root
743- width: units.gu(50)
744- height: units.gu(55)
745+ width: units.gu(140)
746+ height: units.gu(70)
747
748 Loader {
749 id: launcherLoader
750@@ -79,11 +79,40 @@
751 }
752 }
753
754+ Binding {
755+ target: launcherLoader.item
756+ property: "lockedVisible"
757+ value: lockedVisibleCheckBox.checked
758+ }
759+ Binding {
760+ target: launcherLoader.item
761+ property: "panelWidth"
762+ value: units.gu(Math.round(widthSlider.value))
763+ }
764+
765 ColumnLayout {
766 anchors { bottom: parent.bottom; right: parent.right; margins: units.gu(1) }
767 spacing: units.gu(1)
768 width: childrenRect.width
769
770+ RowLayout {
771+ CheckBox {
772+ id: lockedVisibleCheckBox
773+ checked: false
774+ }
775+ Label {
776+ text: "Launcher always visible"
777+ }
778+ }
779+
780+ Slider {
781+ id: widthSlider
782+ Layout.fillWidth: true
783+ minimumValue: 6
784+ maximumValue: 12
785+ value: 10
786+ }
787+
788 MouseTouchEmulationCheckbox {}
789
790 EdgeBarrierControls {
791@@ -217,10 +246,6 @@
792 // growing while populating it with icons etc.
793 tryCompare(listView, "flicking", false);
794
795- // Make sure noone changed the height of the window. The issue this test case
796- // is verifying only happens on certain heights of the Launcher
797- compare(root.height, units.gu(55));
798-
799 compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
800
801 // Now do check that snapping is in fact enabled
802@@ -277,14 +302,21 @@
803
804 function positionLauncherListAtBeginning() {
805 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
806- listView.contentY = -listView.topMargin;
807+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
808+
809+ listView.moveToIndex(0);
810+
811+ waitForRendering(listView);
812+ tryCompare(moveAnimation, "running", false);
813 }
814 function positionLauncherListAtEnd() {
815 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
816- if ((listView.contentHeight + listView.topMargin + listView.bottomMargin) > listView.height) {
817- listView.contentY = listView.topMargin + listView.contentHeight
818- - listView.height;
819- }
820+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
821+
822+ listView.moveToIndex(listView.count -1);
823+
824+ waitForRendering(listView);
825+ tryCompare(moveAnimation, "running", false);
826 }
827
828 function assertFocusOnIndex(index) {
829@@ -292,10 +324,10 @@
830 var bfbFocusHighlight = findChild(launcher, "bfbFocusHighlight");
831
832 waitForRendering(launcher);
833- tryCompare(bfbFocusHighlight, "visible", index === -1);
834+ compare(bfbFocusHighlight.visible, index === -1);
835 for (var i = 0; i < launcherListView.count; i++) {
836 var focusRing = findChild(findChild(launcher, "launcherDelegate" + i), "focusRing")
837- tryCompare(focusRing, "visible", index === i);
838+ compare(focusRing.visible, index === i);
839 }
840 }
841
842@@ -400,6 +432,7 @@
843 wait(100)
844 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
845 }
846+
847 waitUntilLauncherDisappears();
848 launcher.available = true;
849 }
850@@ -423,6 +456,8 @@
851 dragLauncherIntoView();
852 var launcherListView = findChild(launcher, "launcherListView");
853 for (var i = 0; i < launcherListView.count; ++i) {
854+ launcherListView.moveToIndex(i);
855+ waitForRendering(launcherListView);
856 var delegate = findChild(launcherListView, "launcherDelegate" + i)
857 compare(findChild(delegate, "countEmblem").visible, LauncherModel.get(i).countVisible)
858 // Intentionally allow type coercion (string/number)
859@@ -483,6 +518,7 @@
860 launcher.lastSelectedApplication = "";
861 dragLauncherIntoView();
862 var listView = findChild(launcher, "launcherListView");
863+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
864
865 // flicking is unreliable. sometimes it works, sometimes the
866 // list view moves just a tiny bit or not at all, making tests fail.
867@@ -493,12 +529,14 @@
868 } else {
869 positionLauncherListAtEnd();
870 }
871- tryCompare(listView, "flicking", false);
872-
873 var oldY = listView.contentY;
874
875 mouseClick(listView, listView.width / 2, data.clickY);
876- tryCompare(listView, "flicking", false);
877+
878+ if (data.expectFlick) {
879+ tryCompare(moveAnimation, "running", true);
880+ }
881+ tryCompare(moveAnimation, "running", false);
882
883 if (data.expectFlick) {
884 verify(listView.contentY != oldY);
885@@ -1086,12 +1124,15 @@
886 function test_keyboardNavigation() {
887 var bfbFocusHighlight = findChild(launcher, "bfbFocusHighlight");
888 var quickList = findChild(launcher, "quickList");
889+ var launcherPanel = findChild(launcher, "launcherPanel");
890 var launcherListView = findChild(launcher, "launcherListView");
891 var last = launcherListView.count - 1;
892
893 compare(bfbFocusHighlight.visible, false);
894
895 launcher.openForKeyboardNavigation();
896+ tryCompare(launcherPanel, "x", 0);
897+ waitForRendering(launcher);
898
899 assertFocusOnIndex(-1);
900
901@@ -1164,11 +1205,47 @@
902 compare(signalSpy.count, 1, "Quicklist signal wasn't triggered")
903 compare(signalSpy.signalArguments[0][0], LauncherModel.get(1).appId)
904 compare(signalSpy.signalArguments[0][1], 2)
905- }
906-
907- function test_cancelKbdNavigationWitMouse() {
908+ assertFocusOnIndex(-2);
909+ }
910+
911+ function test_hideNotWorkingWhenLockedOut_data() {
912+ return [
913+ {tag: "locked visible", locked: true},
914+ {tag: "no locked visible", locked: false},
915+ ]
916+ }
917+
918+ function test_hideNotWorkingWhenLockedOut(data) {
919+ launcher.lockedVisible = data.locked;
920+ if (data.locked) {
921+ tryCompare(launcher, "state", "visible");
922+ } else {
923+ tryCompare(launcher, "state", "");
924+ }
925+
926+ launcher.hide();
927+ waitForRendering(launcher);
928+ if (data.locked) {
929+ verify(launcher.state == "visible");
930+ } else {
931+ verify(launcher.state == "");
932+ }
933+ }
934+
935+ function test_cancelKbdNavigationWitMouse_data() {
936+ return [
937+ {tag: "locked out - no quicklist", autohide: false, withQuickList: false },
938+ {tag: "locked out - with quicklist", autohide: false, withQuickList: true },
939+ {tag: "autohide - no quicklist", autohide: true, withQuickList: false },
940+ {tag: "autohide - with quicklist", autohide: true, withQuickList: true },
941+ ]
942+ }
943+
944+ function test_cancelKbdNavigationWitMouse(data) {
945+ launcher.autohideEnabled = data.autohide;
946 launcher.openForKeyboardNavigation();
947 waitForRendering(launcher);
948+
949 var launcherPanel = findChild(launcher, "launcherPanel");
950 tryCompare(launcherPanel, "x", 0);
951
952@@ -1176,15 +1253,22 @@
953
954 keyClick(Qt.Key_Down); // Down to launcher item 0
955 keyClick(Qt.Key_Down); // Down to launcher item 1
956- keyClick(Qt.Key_Right); // Into quicklist
957
958+ if (data.withQuickList) {
959+ keyClick(Qt.Key_Right); // Into quicklist
960+ tryCompare(quickList, "visible", true)
961+ }
962 waitForRendering(launcher)
963- tryCompare(quickList, "visible", true)
964-
965- mouseClick(root, root.width / 2, units.gu(2));
966-
967- tryCompare(launcher, "state", "");
968- tryCompare(launcherPanel, "highlightIndex", -2);
969+
970+ mouseClick(root);
971+
972+ if (data.autohide) {
973+ tryCompare(launcher, "state", "");
974+ } else {
975+ tryCompare(launcher, "state", "visible");
976+ }
977+
978+ assertFocusOnIndex(-2);
979 }
980 }
981 }
982
983=== modified file 'tests/qmltests/tst_Shell.qml'
984--- tests/qmltests/tst_Shell.qml 2016-02-19 15:10:33 +0000
985+++ tests/qmltests/tst_Shell.qml 2016-02-19 15:10:34 +0000
986@@ -223,6 +223,19 @@
987 }
988 }
989
990+ Row {
991+ anchors { left: parent.left; right: parent.right }
992+ CheckBox {
993+ id: autohideLauncherCheckbox
994+ onCheckedChanged: {
995+ GSettingsController.setAutohideLauncher(checked)
996+ }
997+ }
998+ Label {
999+ text: "Autohide launcher"
1000+ }
1001+ }
1002+
1003 Label { text: "Applications"; font.bold: true }
1004
1005 Button {
1006@@ -921,6 +934,7 @@
1007 function dragLauncherIntoView() {
1008 var launcher = findChild(shell, "launcher");
1009 var launcherPanel = findChild(launcher, "launcherPanel");
1010+ waitForRendering(launcher);
1011 verify(launcherPanel.x = - launcherPanel.width);
1012
1013 var touchStartX = 2;
1014@@ -1678,7 +1692,7 @@
1015 var x = 0;
1016 var y = shell.height * .5
1017 mouseMove(shell, x, y)
1018- while (x <= spreadFlickable.width) {
1019+ while (x <= shell.width) {
1020 x+=10;
1021 mouseMove(shell, x, y)
1022 wait(0); // spin the loop so bindings get evaluated
1023@@ -1752,25 +1766,38 @@
1024 keyRelease(Qt.Key_Alt);
1025 }
1026
1027- function test_focusAppFromLauncherExitsSpread() {
1028+ function test_focusAppFromLauncherExitsSpread_data() {
1029+ return [
1030+ {tag: "autohide launcher", launcherLocked: false },
1031+ {tag: "locked launcher", launcherLocked: true }
1032+ ]
1033+ }
1034+
1035+ function test_focusAppFromLauncherExitsSpread(data) {
1036 loadDesktopShellWithApps()
1037-
1038+ var launcher = findChild(shell, "launcher");
1039 var desktopSpread = findChild(shell, "spread");
1040- var launcher = findChild(shell, "launcher");
1041 var bfb = findChild(launcher, "buttonShowDashHome");
1042
1043+ GSettingsController.setAutohideLauncher(!data.launcherLocked);
1044+ waitForRendering(shell);
1045+
1046 keyPress(Qt.Key_Alt)
1047 keyClick(Qt.Key_Tab);
1048
1049 tryCompare(desktopSpread, "state", "altTab")
1050
1051- revealLauncherByEdgePushWithMouse();
1052- tryCompare(launcher, "x", 0);
1053- mouseMove(bfb, bfb.width / 2, bfb.height / 2)
1054- waitForRendering(shell)
1055+ if (!data.launcherLocked) {
1056+ revealLauncherByEdgePushWithMouse();
1057+ tryCompare(launcher, "x", 0);
1058+ mouseMove(bfb, bfb.width / 2, bfb.height / 2)
1059+ waitForRendering(shell)
1060+ }
1061
1062 mouseClick(bfb, bfb.width / 2, bfb.height / 2)
1063- tryCompare(launcher, "state", "")
1064+ if (!data.launcherLocked) {
1065+ tryCompare(launcher, "state", "")
1066+ }
1067 tryCompare(desktopSpread, "state", "")
1068
1069 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash")
1070@@ -1998,16 +2025,24 @@
1071 }
1072 }
1073
1074- function test_superTabToCycleLauncher() {
1075+ function test_superTabToCycleLauncher_data() {
1076+ return [
1077+ {tag: "autohide launcher", launcherLocked: false},
1078+ {tag: "locked launcher", launcherLocked: true}
1079+ ]
1080+ }
1081+
1082+ function test_superTabToCycleLauncher(data) {
1083 loadShell("desktop");
1084 shell.usageScenario = "desktop";
1085+ GSettingsController.setAutohideLauncher(!data.launcherLocked);
1086 waitForRendering(shell);
1087
1088 var launcher = findChild(shell, "launcher");
1089 var launcherPanel = findChild(launcher, "launcherPanel");
1090 var firstAppInLauncher = LauncherModel.get(0).appId;
1091
1092- compare(launcher.state, "");
1093+ compare(launcher.state, data.launcherLocked ? "visible": "");
1094 compare(launcherPanel.highlightIndex, -2);
1095 compare(ApplicationManager.focusedApplicationId, "unity8-dash");
1096
1097@@ -2019,7 +2054,7 @@
1098 keyClick(Qt.Key_Tab);
1099 tryCompare(launcherPanel, "highlightIndex", 0);
1100 keyRelease(Qt.Key_Super_L, Qt.MetaModifier);
1101- tryCompare(launcher, "state", "");
1102+ tryCompare(launcher, "state", data.launcherLocked ? "visible" : "");
1103 tryCompare(launcherPanel, "highlightIndex", -2);
1104 tryCompare(ApplicationManager, "focusedApplicationId", firstAppInLauncher);
1105
1106@@ -2029,7 +2064,7 @@
1107 tryCompare(launcher, "state", "visible");
1108 tryCompare(launcherPanel, "highlightIndex", -1);
1109 keyRelease(Qt.Key_Super_L, Qt.MetaModifier);
1110- tryCompare(launcher, "state", "");
1111+ tryCompare(launcher, "state", data.launcherLocked ? "visible" : "");
1112 tryCompare(launcherPanel, "highlightIndex", -2);
1113 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
1114 }
1115@@ -2078,6 +2113,49 @@
1116 tryCompare(launcher, "focus", true)
1117 }
1118
1119+ function test_lockedOutLauncherAddsMarginsToMaximized() {
1120+ loadShell("desktop");
1121+ shell.usageScenario = "desktop";
1122+ waitForRendering(shell);
1123+ var appContainer = findChild(shell, "appContainer");
1124+ var launcher = findChild(shell, "launcher");
1125+
1126+ var app = ApplicationManager.startApplication("music-app");
1127+ waitUntilAppWindowIsFullyLoaded(app);
1128+ var appDelegate = findChild(appContainer, "appDelegate_music-app");
1129+ appDelegate.maximize();
1130+ tryCompare(appDelegate, "visuallyMaximized", true);
1131+ waitForRendering(shell);
1132+
1133+ GSettingsController.setAutohideLauncher(true);
1134+ waitForRendering(shell)
1135+ var hiddenSize = appDelegate.width;
1136+
1137+ GSettingsController.setAutohideLauncher(false);
1138+ waitForRendering(shell)
1139+ var shownSize = appDelegate.width;
1140+
1141+ compare(shownSize + launcher.panelWidth, hiddenSize);
1142+ }
1143+
1144+ function test_fullscreenAppHidesLockedOutLauncher() {
1145+ loadShell("desktop");
1146+ shell.usageScenario = "desktop";
1147+
1148+ var launcher = findChild(shell, "launcher");
1149+ var launcherPanel = findChild(launcher, "launcherPanel");
1150+
1151+ GSettingsController.setAutohideLauncher(false);
1152+ waitForRendering(shell)
1153+
1154+ tryCompare(launcher, "lockedVisible", true);
1155+
1156+ var cameraApp = ApplicationManager.startApplication("camera-app");
1157+ waitUntilAppWindowIsFullyLoaded(cameraApp);
1158+
1159+ tryCompare(launcher, "lockedVisible", false);
1160+ }
1161+
1162 function test_inputEventsOnEdgesEndUpInAppSurface_data() {
1163 return [
1164 { tag: "phone", repeaterName: "spreadRepeater" },

Subscribers

People subscribed via source and target branches