Merge lp:~unity-team/unity8/screens-workspaces-switcher into lp:unity8
- screens-workspaces-switcher
- Merge into trunk
Status: | Needs review |
---|---|
Proposed branch: | lp:~unity-team/unity8/screens-workspaces-switcher |
Merge into: | lp:unity8 |
Prerequisite: | lp:~unity-team/unity8/workspace-backend |
Diff against target: |
2624 lines (+1383/-431) 25 files modified
plugins/WindowManager/Screen.h (+0/-1) plugins/WindowManager/Screens.cpp (+10/-0) plugins/WindowManager/Screens.h (+3/-0) plugins/WindowManager/WorkspaceModel.h (+2/-2) qml/Shell.qml (+4/-4) qml/Stage/ApplicationWindow.qml (+12/-209) qml/Stage/DecoratedWindow.qml (+10/-10) qml/Stage/Spread/ScreensAndWorkspaces.qml (+261/-0) qml/Stage/Spread/Spread.qml (+8/-9) qml/Stage/Spread/SpreadDelegateInputArea.qml (+36/-17) qml/Stage/Spread/WorkspacePreview.qml (+127/-0) qml/Stage/Spread/Workspaces.qml (+412/-0) qml/Stage/Stage.qml (+206/-99) qml/Stage/WindowResizeArea.qml (+27/-4) qml/Stage/WindowStateSaver.qml (+4/-1) qml/Stage/WorkspaceSwitcher.qml (+196/-0) tests/mocks/Unity/Application/MirSurfaceItem.cpp (+26/-7) tests/mocks/Unity/Application/resources/MirSurfaceItem.qml (+0/-3) tests/mocks/WindowManager/MockScreens.cpp (+7/-4) tests/qmltests/Stage/tst_ApplicationWindow.qml (+10/-42) tests/qmltests/Stage/tst_DesktopStage.qml (+0/-2) tests/qmltests/Stage/tst_PhoneStage.qml (+0/-1) tests/qmltests/Stage/tst_TabletStage.qml (+6/-10) tests/qmltests/tst_OrientedShell.qml (+0/-1) tests/qmltests/tst_Shell.qml (+16/-5) |
To merge this branch: | bzr merge lp:~unity-team/unity8/screens-workspaces-switcher |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Unity8 CI Bot | continuous-integration | Needs Fixing | |
Unity Team | Pending | ||
Review via email: mp+320155@code.launchpad.net |
This proposal supersedes a proposal from 2017-02-23.
Commit message
screens and workspaces switcher
Description of the change
Prereq-archive: ppa:ci-
WIP
related branches:
https:/
https:/
https:/
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2764
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2766
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2766
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2787
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2788
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2789
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2790
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2792
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2793
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2794
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2795
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2799
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal | # |
I know this is still very much WIP but better have a look at those missing i18n.tr() calls, otherwise they'll get forgotten for sure :)
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2800
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2801
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2802
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2803
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2804
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2805
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2806
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2807
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2807
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2808
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2809
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2810
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2813
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2814
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2816
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2817
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2818
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2820
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2821
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2822
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2824. By Nick Dedekind
-
merged with prereq
- 2825. By Michael Zanetti
-
fix the mock to not be funky with screen sizes at startup
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2823
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2825
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2826. By Michael Zanetti
-
implement our own popup
- 2827. By Michael Zanetti
-
fix workspace drag reordering again
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2826
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2827
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2828. By Nick Dedekind
-
merged prereq
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2828
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2829
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2830
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2829. By Michael Zanetti
-
bring the splash screen back, drop the screenshot image (surfaces keep on to their buffer now anyways)
- 2830. By Michael Zanetti
-
merge
- 2831. By Michael Zanetti
-
merge
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2831
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2832. By Michael Zanetti
-
some tweaks and cleanups
- 2833. By Michael Zanetti
-
prevent closing a workspace if it's the last one
- 2834. By Michael Zanetti
-
apply nick's patch for fixing tiny window sizes
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2832
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2834
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2835. By Michael Zanetti
-
merge prereq
- 2836. By Michael Zanetti
-
add WorkspaceSwitcher
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2835
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2837. By Nick Dedekind
-
merged with prereq
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2836
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2837
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2838
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2838. By Michael Zanetti
-
don't reach out of context
- 2839. By Michael Zanetti
-
merge
- 2840. By Michael Zanetti
-
merge parent
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2840
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2841. By Nick Dedekind
-
merged parent
- 2842. By Nick Dedekind
-
merged prereq
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2842
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2843. By Michael Zanetti
-
workspace switcher now working
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2843
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2844. By Nick Dedekind
-
merged prereq
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2844
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2844
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2845. By Nick Dedekind
-
merged parent
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2845
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2845
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2846. By Michael Zanetti
-
fix focus issue and activate the surface once dropped on a workspace
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2846
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2847
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2847. By Michael Zanetti
-
decrease timer timeout for hiding the workspaceswitcher
- 2848. By Michael Zanetti
-
merge prereq
- 2849. By Michael Zanetti
-
merge
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2847
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2849
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2850. By Michael Zanetti
-
merge prereq
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2850
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2851. By Michael Zanetti
-
fix testApplication
Window
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2851
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2852. By Michael Zanetti
-
fix testDesktopStage
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2852
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2853. By Michael Zanetti
-
some more tabletstage test fixes
- 2854. By Michael Zanetti
-
merge prereq
- 2855. By Michael Zanetti
-
some more test fixes
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2854
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2855
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2855
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2856. By Michael Zanetti
-
testShell should be working again
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2856
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2857. By Michael Zanetti
-
don't show minimized apps in the workspace previews
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2857
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2858. By Michael Zanetti
-
don't really activate a workspace just yet when clicking on it
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2858
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2859. By Nick Dedekind
-
merged pre-req
- 2860. By Nick Dedekind
-
merged with pre-req
- 2861. By Nick Dedekind
-
merged pre-req
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2859
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2861
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2862. By Nick Dedekind
-
merged prereq
- 2863. By Nick Dedekind
-
merged prereq
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2863
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2864. By Nick Dedekind
-
merged pre-req
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2864
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 2865. By Nick Dedekind
-
merged pre-req
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2865
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2866
https:/
Executed test runs:
Click here to trigger a rebuild:
https:/
- 2866. By Michael Zanetti
-
test fixes
- 2867. By Michael Zanetti
-
merge
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2867
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2868. By Michael Zanetti
-
rework workspace switcher for up/down navigation for screens
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2868
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2869. By Nick Dedekind
-
removed debug
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2869
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unmerged revisions
- 2869. By Nick Dedekind
-
removed debug
- 2868. By Michael Zanetti
-
rework workspace switcher for up/down navigation for screens
- 2867. By Michael Zanetti
-
merge
- 2866. By Michael Zanetti
-
test fixes
- 2865. By Nick Dedekind
-
merged pre-req
- 2864. By Nick Dedekind
-
merged pre-req
- 2863. By Nick Dedekind
-
merged prereq
- 2862. By Nick Dedekind
-
merged prereq
- 2861. By Nick Dedekind
-
merged pre-req
- 2860. By Nick Dedekind
-
merged with pre-req
Preview Diff
1 | === modified file 'plugins/WindowManager/Screen.h' |
2 | --- plugins/WindowManager/Screen.h 2017-04-06 12:58:36 +0000 |
3 | +++ plugins/WindowManager/Screen.h 2017-04-06 12:58:37 +0000 |
4 | @@ -16,7 +16,6 @@ |
5 | Q_OBJECT |
6 | |
7 | Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged) |
8 | - |
9 | Q_PROPERTY(bool used READ used NOTIFY usedChanged) |
10 | Q_PROPERTY(QString name READ name NOTIFY nameChanged) |
11 | Q_PROPERTY(qtmir::OutputTypes outputType READ outputType NOTIFY outputTypeChanged) |
12 | |
13 | === modified file 'plugins/WindowManager/Screens.cpp' |
14 | --- plugins/WindowManager/Screens.cpp 2017-04-06 12:58:36 +0000 |
15 | +++ plugins/WindowManager/Screens.cpp 2017-04-06 12:58:37 +0000 |
16 | @@ -67,6 +67,16 @@ |
17 | return count(); |
18 | } |
19 | |
20 | +int Screens::indexOf(Screen *screen) const |
21 | +{ |
22 | + return m_screens.indexOf(screen); |
23 | +} |
24 | + |
25 | +Screen *Screens::get(int index) const |
26 | +{ |
27 | + return m_screens.at(index); |
28 | +} |
29 | + |
30 | int Screens::count() const |
31 | { |
32 | return m_screens.size(); |
33 | |
34 | === modified file 'plugins/WindowManager/Screens.h' |
35 | --- plugins/WindowManager/Screens.h 2017-04-06 12:58:36 +0000 |
36 | +++ plugins/WindowManager/Screens.h 2017-04-06 12:58:37 +0000 |
37 | @@ -49,6 +49,9 @@ |
38 | QVariant data(const QModelIndex &index, int role = ScreenRole) const override; |
39 | int rowCount(const QModelIndex &parent = QModelIndex()) const override; |
40 | |
41 | + Q_INVOKABLE int indexOf(Screen*) const; |
42 | + Q_INVOKABLE Screen* get(int index) const; |
43 | + |
44 | int count() const; |
45 | QVariant activeScreen() const; |
46 | |
47 | |
48 | === modified file 'plugins/WindowManager/WorkspaceModel.h' |
49 | --- plugins/WindowManager/WorkspaceModel.h 2017-04-06 12:58:36 +0000 |
50 | +++ plugins/WindowManager/WorkspaceModel.h 2017-04-06 12:58:37 +0000 |
51 | @@ -49,8 +49,8 @@ |
52 | void remove(Workspace* workspace); |
53 | virtual void move(int from, int to); |
54 | |
55 | - int indexOf(Workspace *workspace) const; |
56 | - Workspace* get(int index) const; |
57 | + Q_INVOKABLE int indexOf(Workspace *workspace) const; |
58 | + Q_INVOKABLE Workspace* get(int index) const; |
59 | |
60 | // From QAbstractItemModel |
61 | int rowCount(const QModelIndex &parent = QModelIndex()) const override; |
62 | |
63 | === modified file 'qml/Shell.qml' |
64 | --- qml/Shell.qml 2017-04-06 12:58:36 +0000 |
65 | +++ qml/Shell.qml 2017-04-06 12:58:37 +0000 |
66 | @@ -99,7 +99,7 @@ |
67 | |
68 | readonly property var topLevelSurfaceList: { |
69 | if (!WMScreen.currentWorkspace) return null; |
70 | - return WMScreen.currentWorkspace.windowModel |
71 | + return stage.temporarySelectedWorkspace ? stage.temporarySelectedWorkspace.windowModel : WMScreen.currentWorkspace.windowModel |
72 | } |
73 | |
74 | onMainAppChanged: { |
75 | @@ -189,11 +189,11 @@ |
76 | } |
77 | |
78 | function startApp(appId) { |
79 | - if (ApplicationManager.findApplication(appId)) { |
80 | - ApplicationManager.requestFocusApplication(appId); |
81 | - } else { |
82 | + if (!ApplicationManager.findApplication(appId)) { |
83 | ApplicationManager.startApplication(appId); |
84 | } |
85 | + ApplicationManager.requestFocusApplication(appId); |
86 | + stage.closeSpread(); |
87 | } |
88 | |
89 | function startLockedApp(app) { |
90 | |
91 | === modified file 'qml/Stage/ApplicationWindow.qml' |
92 | --- qml/Stage/ApplicationWindow.qml 2017-02-24 12:37:14 +0000 |
93 | +++ qml/Stage/ApplicationWindow.qml 2017-04-06 12:58:37 +0000 |
94 | @@ -52,13 +52,8 @@ |
95 | // other instructions. |
96 | if (surface) { |
97 | surfaceContainer.surface = surface; |
98 | - d.liveSurface = surface.live; |
99 | - d.hadSurface = false; |
100 | surfaceInitTimer.start(); |
101 | } else { |
102 | - if (d.surfaceInitialized) { |
103 | - d.hadSurface = true; |
104 | - } |
105 | d.surfaceInitialized = false; |
106 | surfaceContainer.surface = null; |
107 | } |
108 | @@ -67,21 +62,6 @@ |
109 | QtObject { |
110 | id: d |
111 | |
112 | - property bool liveSurface: false; |
113 | - property var con: Connections { |
114 | - target: root.surface |
115 | - onLiveChanged: d.liveSurface = root.surface.live |
116 | - } |
117 | - // using liveSurface instead of root.surface.live because with the latter |
118 | - // this expression is not reevaluated when root.surface changes |
119 | - readonly property bool needToTakeScreenshot: root.surface && d.surfaceInitialized && !d.liveSurface |
120 | - && applicationState !== ApplicationInfoInterface.Running |
121 | - onNeedToTakeScreenshotChanged: { |
122 | - if (needToTakeScreenshot && screenshotImage.status === Image.Null) { |
123 | - screenshotImage.take(); |
124 | - } |
125 | - } |
126 | - |
127 | // helpers so that we don't have to check for the existence of an application everywhere |
128 | // (in order to avoid breaking qml binding due to a javascript exception) |
129 | readonly property string name: root.application ? root.application.name : "" |
130 | @@ -131,34 +111,10 @@ |
131 | id: surfaceInitTimer |
132 | interval: 100 |
133 | onTriggered: { |
134 | - if (root.surface && root.surface.live) {d.surfaceInitialized = true;} |
135 | - } |
136 | - } |
137 | - |
138 | - Timer { |
139 | - id: surfaceIsOldTimer |
140 | - interval: 1000 |
141 | - onTriggered: { if (stateGroup.state === "surface") { d.surfaceOldEnoughToBeResized = true; } } |
142 | - } |
143 | - |
144 | - Image { |
145 | - id: screenshotImage |
146 | - objectName: "screenshotImage" |
147 | - anchors.fill: parent |
148 | - fillMode: Image.PreserveAspectCrop |
149 | - horizontalAlignment: Image.AlignLeft |
150 | - verticalAlignment: Image.AlignTop |
151 | - antialiasing: !root.interactive |
152 | - z: 1 |
153 | - |
154 | - function take() { |
155 | - // Save memory by using a half-resolution (thus quarter size) screenshot. |
156 | - // Do not make this a binding, we can only take the screenshot once! |
157 | - surfaceContainer.grabToImage( |
158 | - function(result) { |
159 | - screenshotImage.source = result.url; |
160 | - }, |
161 | - Qt.size(root.width / 2, root.height / 2)); |
162 | + if (root.surface && root.surface.live) { |
163 | + d.surfaceInitialized = true; |
164 | + d.hadSurface = true; |
165 | + } |
166 | } |
167 | } |
168 | |
169 | @@ -167,7 +123,7 @@ |
170 | visible: active |
171 | active: false |
172 | anchors.fill: parent |
173 | - z: screenshotImage.z + 1 |
174 | + z: 1 |
175 | sourceComponent: Component { |
176 | Splash { |
177 | id: splash |
178 | @@ -238,167 +194,14 @@ |
179 | id: stateGroup |
180 | objectName: "applicationWindowStateGroup" |
181 | states: [ |
182 | - State { |
183 | - name: "void" |
184 | - when: |
185 | - d.hadSurface && (!root.surface || !d.surfaceInitialized) |
186 | - && |
187 | - screenshotImage.status !== Image.Ready |
188 | - }, |
189 | - State { |
190 | - name: "splashScreen" |
191 | - when: |
192 | - !d.hadSurface && (!root.surface || !d.surfaceInitialized) |
193 | - && |
194 | - screenshotImage.status !== Image.Ready |
195 | - }, |
196 | - State { |
197 | + State{ |
198 | name: "surface" |
199 | - when: |
200 | - (root.surface && d.surfaceInitialized) |
201 | - && |
202 | - (d.liveSurface || |
203 | - (d.applicationState !== ApplicationInfoInterface.Running |
204 | - && screenshotImage.status !== Image.Ready)) |
205 | - PropertyChanges { |
206 | - target: root |
207 | - implicitWidth: surfaceContainer.implicitWidth |
208 | - implicitHeight: surfaceContainer.implicitHeight |
209 | - } |
210 | - }, |
211 | - State { |
212 | - name: "screenshot" |
213 | - when: |
214 | - screenshotImage.status === Image.Ready |
215 | - && |
216 | - (d.applicationState !== ApplicationInfoInterface.Running |
217 | - || !root.surface || !d.surfaceInitialized) |
218 | - }, |
219 | - State { |
220 | - // This is a dead end. From here we expect the surface to be removed from the model |
221 | - // shortly after we stop referencing to it in our SurfaceContainer. |
222 | - name: "closed" |
223 | - when: |
224 | - // The surface died while the application is running. It must have been closed |
225 | - // by the shell or the application decided to destroy it by itself |
226 | - root.surface && d.surfaceInitialized && !d.liveSurface |
227 | - && d.applicationState === ApplicationInfoInterface.Running |
228 | - } |
229 | - ] |
230 | - |
231 | - transitions: [ |
232 | - Transition { |
233 | - from: ""; to: "splashScreen" |
234 | - PropertyAction { target: splashLoader; property: "active"; value: true } |
235 | - PropertyAction { target: surfaceContainer |
236 | - property: "visible"; value: false } |
237 | - }, |
238 | - Transition { |
239 | - from: "splashScreen"; to: "surface" |
240 | - SequentialAnimation { |
241 | - PropertyAction { target: surfaceContainer |
242 | - property: "opacity"; value: 0.0 } |
243 | - PropertyAction { target: surfaceContainer |
244 | - property: "visible"; value: true } |
245 | - UbuntuNumberAnimation { target: surfaceContainer; property: "opacity"; |
246 | - from: 0.0; to: 1.0 |
247 | - duration: UbuntuAnimation.BriskDuration } |
248 | - ScriptAction { script: { |
249 | - splashLoader.active = false; |
250 | - surfaceIsOldTimer.start(); |
251 | - } } |
252 | - } |
253 | - }, |
254 | - Transition { |
255 | - from: "surface"; to: "splashScreen" |
256 | - SequentialAnimation { |
257 | - ScriptAction { script: { |
258 | - surfaceIsOldTimer.stop(); |
259 | - d.surfaceOldEnoughToBeResized = false; |
260 | - splashLoader.active = true; |
261 | - surfaceContainer.visible = true; |
262 | - } } |
263 | - UbuntuNumberAnimation { target: splashLoader; property: "opacity"; |
264 | - from: 0.0; to: 1.0 |
265 | - duration: UbuntuAnimation.BriskDuration } |
266 | - PropertyAction { target: surfaceContainer |
267 | - property: "visible"; value: false } |
268 | - } |
269 | - }, |
270 | - Transition { |
271 | - from: "surface"; to: "screenshot" |
272 | - SequentialAnimation { |
273 | - ScriptAction { script: { |
274 | - surfaceIsOldTimer.stop(); |
275 | - d.surfaceOldEnoughToBeResized = false; |
276 | - screenshotImage.visible = true; |
277 | - } } |
278 | - UbuntuNumberAnimation { target: screenshotImage; property: "opacity"; |
279 | - from: 0.0; to: 1.0 |
280 | - duration: UbuntuAnimation.BriskDuration } |
281 | - ScriptAction { script: { |
282 | - surfaceContainer.visible = false; |
283 | - surfaceContainer.surface = null; |
284 | - d.hadSurface = true; |
285 | - } } |
286 | - } |
287 | - }, |
288 | - Transition { |
289 | - from: "screenshot"; to: "surface" |
290 | - SequentialAnimation { |
291 | - PropertyAction { target: surfaceContainer |
292 | - property: "visible"; value: true } |
293 | - UbuntuNumberAnimation { target: screenshotImage; property: "opacity"; |
294 | - from: 1.0; to: 0.0 |
295 | - duration: UbuntuAnimation.BriskDuration } |
296 | - ScriptAction { script: { |
297 | - screenshotImage.visible = false; |
298 | - screenshotImage.source = ""; |
299 | - surfaceIsOldTimer.start(); |
300 | - } } |
301 | - } |
302 | - }, |
303 | - Transition { |
304 | - from: "splashScreen"; to: "screenshot" |
305 | - SequentialAnimation { |
306 | - PropertyAction { target: screenshotImage |
307 | - property: "visible"; value: true } |
308 | - UbuntuNumberAnimation { target: screenshotImage; property: "opacity"; |
309 | - from: 0.0; to: 1.0 |
310 | - duration: UbuntuAnimation.BriskDuration } |
311 | - PropertyAction { target: splashLoader; property: "active"; value: false } |
312 | - } |
313 | - }, |
314 | - Transition { |
315 | - from: "surface"; to: "void" |
316 | - ScriptAction { script: { |
317 | - surfaceIsOldTimer.stop(); |
318 | - d.surfaceOldEnoughToBeResized = false; |
319 | - surfaceContainer.visible = false; |
320 | - } } |
321 | - }, |
322 | - Transition { |
323 | - from: "void"; to: "surface" |
324 | - SequentialAnimation { |
325 | - PropertyAction { target: surfaceContainer; property: "opacity"; value: 0.0 } |
326 | - PropertyAction { target: surfaceContainer; property: "visible"; value: true } |
327 | - UbuntuNumberAnimation { target: surfaceContainer; property: "opacity"; |
328 | - from: 0.0; to: 1.0 |
329 | - duration: UbuntuAnimation.BriskDuration } |
330 | - ScriptAction { script: { |
331 | - surfaceIsOldTimer.start(); |
332 | - } } |
333 | - } |
334 | - }, |
335 | - Transition { |
336 | - to: "closed" |
337 | - SequentialAnimation { |
338 | - ScriptAction { script: { |
339 | - surfaceContainer.visible = false; |
340 | - surfaceContainer.surface = null; |
341 | - d.hadSurface = true; |
342 | - } } |
343 | - } |
344 | + when: (root.surface && d.surfaceInitialized) || d.hadSurface |
345 | + }, |
346 | + State { |
347 | + name: "splash" |
348 | + when: !root.surface && !d.surfaceInitialized && !d.hadSurface |
349 | + PropertyChanges { target: splashLoader; active: true } |
350 | } |
351 | ] |
352 | } |
353 | |
354 | === modified file 'qml/Stage/DecoratedWindow.qml' |
355 | --- qml/Stage/DecoratedWindow.qml 2017-04-06 12:58:36 +0000 |
356 | +++ qml/Stage/DecoratedWindow.qml 2017-04-06 12:58:37 +0000 |
357 | @@ -126,15 +126,15 @@ |
358 | name: "preview"; when: root.scaleToPreviewProgress > 0 |
359 | PropertyChanges { |
360 | target: root |
361 | - implicitWidth: MathUtils.linearAnimation(0, 1, applicationWindow.oldRequestedWidth, root.scaleToPreviewSize, root.scaleToPreviewProgress) |
362 | - implicitHeight: MathUtils.linearAnimation(0, 1, applicationWindow.oldRequestedHeight, root.scaleToPreviewSize, root.scaleToPreviewProgress) |
363 | + implicitWidth: MathUtils.linearAnimation(0, 1, applicationWindow.requestedWidth, root.scaleToPreviewSize, root.scaleToPreviewProgress) |
364 | + implicitHeight: MathUtils.linearAnimation(0, 1, applicationWindow.requestedHeight, root.scaleToPreviewSize, root.scaleToPreviewProgress) |
365 | } |
366 | PropertyChanges { |
367 | target: applicationWindow; |
368 | - requestedWidth: applicationWindow.oldRequestedWidth |
369 | - requestedHeight: applicationWindow.oldRequestedHeight |
370 | - width: MathUtils.linearAnimation(0, 1, applicationWindow.oldRequestedWidth, applicationWindow.minSize, root.scaleToPreviewProgress) |
371 | - height: MathUtils.linearAnimation(0, 1, applicationWindow.oldRequestedHeight, applicationWindow.minSize, root.scaleToPreviewProgress) |
372 | +// requestedWidth: applicationWindow.oldRequestedWidth |
373 | +// requestedHeight: applicationWindow.oldRequestedHeight |
374 | + width: MathUtils.linearAnimation(0, 1, applicationWindow.requestedWidth, applicationWindow.minSize, root.scaleToPreviewProgress) |
375 | + height: MathUtils.linearAnimation(0, 1, applicationWindow.requestedHeight, applicationWindow.minSize, root.scaleToPreviewProgress) |
376 | itemScale: root.implicitWidth / width |
377 | } |
378 | } |
379 | @@ -173,10 +173,10 @@ |
380 | height: implicitHeight |
381 | requestedHeight: !counterRotate ? root.requestedHeight - d.requestedDecorationHeight : root.requestedWidth |
382 | requestedWidth: !counterRotate ? root.requestedWidth : root.requestedHeight - d.requestedDecorationHeight |
383 | - property int oldRequestedWidth: requestedWidth |
384 | - property int oldRequestedHeight: requestedHeight |
385 | - onRequestedWidthChanged: oldRequestedWidth = requestedWidth |
386 | - onRequestedHeightChanged: oldRequestedHeight = requestedHeight |
387 | +// property int oldRequestedWidth: requestedWidth |
388 | +// property int oldRequestedHeight: requestedHeight |
389 | +// onRequestedWidthChanged: oldRequestedWidth = requestedWidth |
390 | +// onRequestedHeightChanged: oldRequestedHeight = requestedHeight |
391 | focus: true |
392 | |
393 | property real itemScale: 1 |
394 | |
395 | === added file 'qml/Stage/Spread/ScreensAndWorkspaces.qml' |
396 | --- qml/Stage/Spread/ScreensAndWorkspaces.qml 1970-01-01 00:00:00 +0000 |
397 | +++ qml/Stage/Spread/ScreensAndWorkspaces.qml 2017-04-06 12:58:37 +0000 |
398 | @@ -0,0 +1,261 @@ |
399 | +import QtQuick 2.4 |
400 | +import Ubuntu.Components 1.3 |
401 | +import Ubuntu.Components.Popups 1.3 |
402 | +import WindowManager 1.0 |
403 | +import Unity.Application 0.1 |
404 | +import ".." |
405 | + |
406 | +Item { |
407 | + id: root |
408 | + |
409 | + property string background |
410 | + |
411 | + property var screensProxy: Screens.createProxy(); |
412 | + |
413 | + property QtObject activeWorkspace: null |
414 | + |
415 | + signal closeSpread(); |
416 | + |
417 | + Row { |
418 | + id: row |
419 | + anchors.bottom: parent.bottom |
420 | + anchors.horizontalCenter: parent.horizontalCenter |
421 | + Behavior on anchors.horizontalCenterOffset { NumberAnimation { duration: UbuntuAnimation.SlowDuration } } |
422 | + spacing: units.gu(1) |
423 | + |
424 | + property var selectedIndex: undefined |
425 | + |
426 | + Repeater { |
427 | + model: screensProxy |
428 | + |
429 | + delegate: Item { |
430 | + height: root.height - units.gu(6) |
431 | + width: workspaces.width |
432 | + |
433 | + Item { |
434 | + id: header |
435 | + anchors { left: parent.left; top: parent.top; right: parent.right } |
436 | + height: units.gu(7) |
437 | + z: 1 |
438 | + |
439 | + property bool isCurrent: { |
440 | + // another screen is selected. |
441 | + if (row.selectedIndex != undefined && row.selectedIndex != index) return false; |
442 | + |
443 | + // this screen is active. |
444 | + if (WMScreen.active && WMScreen.isSameAs(model.screen) && WMScreen.currentWorkspace.isSameAs(activeWorkspace)) return true; |
445 | + if (model.screen.workspaces.indexOf(activeWorkspace) >= 0) return true; |
446 | + |
447 | + // not active. |
448 | + return false; |
449 | + } |
450 | + |
451 | + property bool isSelected: screenMA.containsMouse |
452 | + onIsSelectedChanged: { |
453 | + if (isSelected) { |
454 | + row.selectedIndex = Qt.binding(function() { return index; }); |
455 | + } else if (row.selectedIndex === index) { |
456 | + row.selectedIndex = undefined; |
457 | + } |
458 | + } |
459 | + |
460 | + UbuntuShape { |
461 | + anchors.fill: parent |
462 | + backgroundColor: "white" |
463 | + opacity: header.isCurrent || header.isSelected ? 1.0 : 0.5 |
464 | + } |
465 | + |
466 | + DropArea { |
467 | + anchors.fill: parent |
468 | + keys: ["workspace"] |
469 | + |
470 | + onEntered: { |
471 | + workspaces.workspaceModel.insert(workspaces.workspaceModel.count, {text: drag.source.text}) |
472 | + drag.source.inDropArea = true; |
473 | + } |
474 | + |
475 | + onExited: { |
476 | + workspaces.workspaceModel.remove(workspaces.workspaceModel.count - 1, 1) |
477 | + drag.source.inDropArea = false; |
478 | + } |
479 | + |
480 | + onDropped: { |
481 | + drag.source.inDropArea = false; |
482 | + } |
483 | + } |
484 | + |
485 | + Column { |
486 | + anchors.fill: parent |
487 | + anchors.margins: units.gu(1) |
488 | + |
489 | + Label { |
490 | + text: model.screen.name |
491 | + color: header.isCurrent || header.isSelected ? "black" : "white" |
492 | + } |
493 | + |
494 | + Label { |
495 | + text: model.screen.outputTypeName |
496 | + color: header.isCurrent || header.isSelected ? "black" : "white" |
497 | + fontSize: "x-small" |
498 | + } |
499 | + |
500 | + Label { |
501 | + text: screen.availableModes[screen.currentModeIndex].size.width + "x" + screen.availableModes[screen.currentModeIndex].size.height |
502 | + color: header.isCurrent || header.isSelected ? "black" : "white" |
503 | + fontSize: "x-small" |
504 | + } |
505 | + } |
506 | + |
507 | + Icon { |
508 | + anchors { |
509 | + top: parent.top |
510 | + right: parent.right |
511 | + margins: units.gu(1) |
512 | + } |
513 | + width: units.gu(3) |
514 | + height: width |
515 | + source: "image://theme/select" |
516 | + color: header.isCurrent || header.isSelected ? "black" : "white" |
517 | + visible: model.screen.active |
518 | + } |
519 | + |
520 | + MouseArea { |
521 | + id: screenMA |
522 | + hoverEnabled: true |
523 | + anchors.fill: parent |
524 | + |
525 | + onClicked: { |
526 | + var obj = screensMenuComponent.createObject(header) |
527 | + obj.open(mouseX, mouseY) |
528 | + } |
529 | + } |
530 | + |
531 | + Component { |
532 | + id: screensMenuComponent |
533 | + UbuntuShape { |
534 | + id: screensMenu |
535 | + width: units.gu(20) |
536 | + height: contentColumn.childrenRect.height |
537 | + backgroundColor: "white" |
538 | + |
539 | + function open(mouseX, mouseY) { |
540 | + x = Math.max(0, Math.min(mouseX - width / 2, parent.width - width)) |
541 | + y = mouseY + units.gu(1) |
542 | + } |
543 | + |
544 | + InverseMouseArea { |
545 | + anchors.fill: parent |
546 | + onClicked: { |
547 | + screensMenu.destroy() |
548 | + } |
549 | + } |
550 | + |
551 | + Column { |
552 | + id: contentColumn |
553 | + width: parent.width |
554 | + ListItem { |
555 | + height: layout.height |
556 | + highlightColor: "transparent" |
557 | + ListItemLayout { |
558 | + id: layout |
559 | + title.text: qsTr("Add workspace") |
560 | + title.color: "black" |
561 | + } |
562 | + onClicked: { |
563 | + screen.workspaces.addWorkspace(); |
564 | + Screens.sync(root.screensProxy); |
565 | + screensMenu.destroy(); |
566 | + } |
567 | + } |
568 | + } |
569 | + } |
570 | + } |
571 | + } |
572 | + |
573 | + Workspaces { |
574 | + id: workspaces |
575 | + height: parent.height - header.height - units.gu(2) |
576 | + width: { |
577 | + var width = 0; |
578 | + if (screensProxy.count == 1) { |
579 | + width = Math.min(implicitWidth, root.width - units.gu(8)); |
580 | + } else { |
581 | + width = Math.min(implicitWidth, model.screen.active ? root.width - units.gu(48) : units.gu(40)) |
582 | + } |
583 | + return Math.max(workspaces.minimumWidth, width); |
584 | + } |
585 | + |
586 | + Behavior on width { UbuntuNumberAnimation {} } |
587 | + anchors.bottom: parent.bottom |
588 | + anchors.bottomMargin: units.gu(1) |
589 | + anchors.horizontalCenter: parent.horizontalCenter |
590 | + screen: model.screen |
591 | + background: root.background |
592 | + |
593 | + workspaceModel: model.screen.workspaces |
594 | + activeWorkspace: root.activeWorkspace |
595 | + readOnly: false |
596 | + |
597 | + onCommitScreenSetup: Screens.sync(root.screensProxy) |
598 | + onCloseSpread: root.closeSpread(); |
599 | + |
600 | + onClicked: { |
601 | + root.activeWorkspace = workspace; |
602 | + } |
603 | + } |
604 | + } |
605 | + } |
606 | + } |
607 | + |
608 | + Rectangle { |
609 | + anchors { left: parent.left; top: parent.top; bottom: parent.bottom; topMargin: units.gu(6); bottomMargin: units.gu(1) } |
610 | + width: units.gu(5) |
611 | + color: "#33000000" |
612 | + visible: (row.width - root.width + units.gu(10)) / 2 - row.anchors.horizontalCenterOffset > units.gu(5) |
613 | + MouseArea { |
614 | + id: leftScrollArea |
615 | + anchors.fill: parent |
616 | + hoverEnabled: true |
617 | + onPressed: mouse.accepted = false; |
618 | + } |
619 | + DropArea { |
620 | + id: leftFakeDropArea |
621 | + anchors.fill: parent |
622 | + keys: ["application", "workspace"] |
623 | + } |
624 | + } |
625 | + Rectangle { |
626 | + anchors { right: parent.right; top: parent.top; bottom: parent.bottom; topMargin: units.gu(6); bottomMargin: units.gu(1) } |
627 | + width: units.gu(5) |
628 | + color: "#33000000" |
629 | + visible: (row.width - root.width + units.gu(10)) / 2 + row.anchors.horizontalCenterOffset > units.gu(5) |
630 | + MouseArea { |
631 | + id: rightScrollArea |
632 | + anchors.fill: parent |
633 | + hoverEnabled: true |
634 | + onPressed: mouse.accepted = false; |
635 | + } |
636 | + DropArea { |
637 | + id: rightFakeDropArea |
638 | + anchors.fill: parent |
639 | + keys: ["application", "workspace"] |
640 | + } |
641 | + } |
642 | + Timer { |
643 | + repeat: true |
644 | + running: leftScrollArea.containsMouse || rightScrollArea.containsMouse || leftFakeDropArea.containsDrag || rightFakeDropArea.containsDrag |
645 | + interval: UbuntuAnimation.SlowDuration |
646 | + triggeredOnStart: true |
647 | + onTriggered: { |
648 | + var newOffset = row.anchors.horizontalCenterOffset; |
649 | + var maxOffset = Math.max((row.width - root.width + units.gu(10)) / 2, 0); |
650 | + if (leftScrollArea.containsMouse || leftFakeDropArea.containsDrag) { |
651 | + newOffset += units.gu(20) |
652 | + } else { |
653 | + newOffset -= units.gu(20) |
654 | + } |
655 | + newOffset = Math.max(-maxOffset, Math.min(maxOffset, newOffset)); |
656 | + row.anchors.horizontalCenterOffset = newOffset; |
657 | + } |
658 | + } |
659 | +} |
660 | |
661 | === modified file 'qml/Stage/Spread/Spread.qml' |
662 | --- qml/Stage/Spread/Spread.qml 2017-03-09 09:31:43 +0000 |
663 | +++ qml/Stage/Spread/Spread.qml 2017-04-06 12:58:37 +0000 |
664 | @@ -28,10 +28,10 @@ |
665 | property var spreadFlickable |
666 | |
667 | // some config options |
668 | - property real contentMargin: 0.16 * root.height |
669 | - property real contentTopMargin: contentMargin |
670 | - property real contentBottomMargin: 0.35 * contentMargin |
671 | - property real windowTitleTopMargin: 3/4 * (contentTopMargin - windowTitle.height) |
672 | + property real contentMargin: 0.1 * root.height |
673 | + property real contentTopMargin: contentMargin + root.y + windowTitle.height |
674 | + property real contentBottomMargin: contentMargin |
675 | + property real windowTitleTopMargin: contentMargin - windowTitle.height |
676 | property int stackItemCount: 3 |
677 | property real leftRotationAngle: 22 |
678 | property real rightRotationAngle: 32 |
679 | @@ -52,7 +52,7 @@ |
680 | |
681 | readonly property real spreadWidth: rightStackXPos - leftStackXPos |
682 | readonly property real spreadHeight: root.height |
683 | - readonly property real spreadItemHeight: spreadHeight - contentTopMargin - contentBottomMargin |
684 | + readonly property real spreadItemHeight: spreadHeight - contentMargin * 2 |
685 | readonly property real spreadItemWidth: stackHeight |
686 | |
687 | readonly property real dynamicLeftRotationAngle: leftRotationAngle * rotationAngleFactor |
688 | @@ -92,10 +92,9 @@ |
689 | |
690 | readonly property real visibleItemCount: (spreadWidth / spreadItemWidth) / (1 - itemOverlap) |
691 | |
692 | - readonly property real spreadTotalWidth: Math.max(2,totalItemCount) * spreadWidth / visibleItemCount |
693 | - |
694 | - readonly property real centeringOffset: Math.max(spreadWidth - spreadTotalWidth ,0) / (2 * spreadWidth) |
695 | - |
696 | + readonly property real spreadTotalWidth: totalItemCount * spreadWidth / visibleItemCount |
697 | + |
698 | + readonly property real centeringOffset: Math.max(spreadWidth - spreadTotalWidth + (leftStackXPos - leftMargin) * 2, 0) / (2 * spreadWidth) |
699 | |
700 | readonly property var curve: BezierCurve { |
701 | controlPoint2: {'x': 0.19, 'y': 0.00} |
702 | |
703 | === modified file 'qml/Stage/Spread/SpreadDelegateInputArea.qml' |
704 | --- qml/Stage/Spread/SpreadDelegateInputArea.qml 2016-11-07 14:07:45 +0000 |
705 | +++ qml/Stage/Spread/SpreadDelegateInputArea.qml 2017-04-06 12:58:37 +0000 |
706 | @@ -28,6 +28,9 @@ |
707 | |
708 | readonly property alias distance: d.distance |
709 | |
710 | + property var stage: null |
711 | + property var dragDelegate: null |
712 | + |
713 | signal clicked() |
714 | signal close() |
715 | |
716 | @@ -84,33 +87,27 @@ |
717 | } |
718 | } |
719 | |
720 | - // Event eater |
721 | - MouseArea { |
722 | - anchors.fill: parent |
723 | - onClicked: root.clicked() |
724 | - onWheel: wheel.accepted = true |
725 | - } |
726 | - |
727 | MultiPointTouchArea { |
728 | anchors.fill: parent |
729 | - mouseEnabled: false |
730 | maximumTouchPoints: 1 |
731 | property int offset: 0 |
732 | |
733 | + // tp.startY seems to be broken for mouse interaction... lets track it ourselves |
734 | + property int startY: 0 |
735 | + |
736 | touchPoints: [ |
737 | TouchPoint { |
738 | id: tp |
739 | } |
740 | ] |
741 | |
742 | - onCanceled: { |
743 | - d.moving = false |
744 | - animation.animate("center"); |
745 | + onPressed: { |
746 | + startY = tp.y |
747 | } |
748 | |
749 | onTouchUpdated: { |
750 | - if (!d.moving) { |
751 | - if (Math.abs(tp.startY - tp.y) > d.threshold) { |
752 | + if (!d.moving || !tp.pressed) { |
753 | + if (Math.abs(startY - tp.y) > d.threshold) { |
754 | d.moving = true; |
755 | d.dragEvents = [] |
756 | offset = tp.y - tp.startY; |
757 | @@ -119,17 +116,32 @@ |
758 | } |
759 | } |
760 | |
761 | - if (root.closeable) { |
762 | - d.distance = tp.y - tp.startY - offset |
763 | + |
764 | + var value = tp.y - tp.startY - offset; |
765 | + if (value < 0) { |
766 | + var coords = mapToItem(stage, tp.x, tp.y); |
767 | + dragDelegate.Drag.hotSpot.x = dragDelegate.width / 2 |
768 | + dragDelegate.Drag.hotSpot.y = units.gu(2) |
769 | + dragDelegate.x = coords.x - dragDelegate.Drag.hotSpot.x |
770 | + dragDelegate.y = coords.y - dragDelegate.Drag.hotSpot.y |
771 | + dragDelegate.Drag.active = true; |
772 | + dragDelegate.surface = model.window.surface; |
773 | + |
774 | } else { |
775 | - var value = tp.y - tp.startY - offset; |
776 | - d.distance = Math.sqrt(Math.abs(value)) * (value < 0 ? -1 : 1) * 3 |
777 | + if (root.closeable) { |
778 | + d.distance = value |
779 | + } else { |
780 | + d.distance = Math.sqrt(Math.abs(value)) * (value < 0 ? -1 : 1) * 3 |
781 | + } |
782 | } |
783 | |
784 | d.pushDragEvent(tp); |
785 | } |
786 | |
787 | onReleased: { |
788 | + var result = dragDelegate.Drag.drop(); |
789 | + dragDelegate.surface = null; |
790 | + |
791 | if (!d.moving) { |
792 | root.clicked() |
793 | } |
794 | @@ -149,6 +161,13 @@ |
795 | animation.animate("center") |
796 | } |
797 | } |
798 | + |
799 | + onCanceled: { |
800 | + dragDelegate.Drag.active = false; |
801 | + dragDelegate.surface = null; |
802 | + d.moving = false |
803 | + animation.animate("center"); |
804 | + } |
805 | } |
806 | |
807 | UbuntuNumberAnimation { |
808 | |
809 | === added file 'qml/Stage/Spread/WorkspacePreview.qml' |
810 | --- qml/Stage/Spread/WorkspacePreview.qml 1970-01-01 00:00:00 +0000 |
811 | +++ qml/Stage/Spread/WorkspacePreview.qml 2017-04-06 12:58:37 +0000 |
812 | @@ -0,0 +1,127 @@ |
813 | +import QtQuick 2.4 |
814 | +import Ubuntu.Components 1.3 |
815 | +import Unity.Application 0.1 |
816 | +import WindowManager 1.0 |
817 | +import ".." |
818 | +import "../../Components" |
819 | + |
820 | +Item { |
821 | + id: previewSpace |
822 | + clip: true |
823 | + |
824 | + property var workspace |
825 | + |
826 | + property string background |
827 | + property int screenHeight |
828 | + |
829 | + property real previewScale: previewSpace.height / previewSpace.screenHeight |
830 | + |
831 | + property bool containsDragLeft: false |
832 | + property bool containsDragRight: false |
833 | + property bool isActive: false |
834 | + property bool isSelected: false |
835 | + |
836 | + Image { |
837 | + source: previewSpace.background |
838 | + anchors.fill: parent |
839 | + sourceSize.width: width |
840 | + sourceSize.height: height |
841 | + |
842 | + Repeater { |
843 | + id: topLevelSurfaceRepeater |
844 | + model: visible ? workspace.windowModel : null |
845 | + delegate: Item { |
846 | + width: surfaceItem.width |
847 | + height: surfaceItem.height + decorationHeight * previewScale |
848 | + x: model.window.position.x * previewScale |
849 | + y: (model.window.position.y - decorationHeight) * previewScale |
850 | + z: topLevelSurfaceRepeater.count - index |
851 | + visible: model.window.state !== Mir.MinimizedState && model.window.state !== Mir.HiddenState |
852 | + |
853 | + property int decorationHeight: units.gu(3) |
854 | + |
855 | + WindowDecoration { |
856 | + width: surfaceItem.implicitWidth |
857 | + height: parent.decorationHeight |
858 | + transform: Scale { |
859 | + origin.x: 0 |
860 | + origin.y: 0 |
861 | + xScale: previewScale |
862 | + yScale: previewScale |
863 | + } |
864 | + title: model.window && model.window.surface ? model.window.surface.name : "" |
865 | + z: 3 |
866 | + } |
867 | + |
868 | + MirSurfaceItem { |
869 | + id: surfaceItem |
870 | + y: parent.decorationHeight * previewScale |
871 | + width: implicitWidth * previewScale |
872 | + height: implicitHeight * previewScale |
873 | + surfaceWidth: -1 |
874 | + surfaceHeight: -1 |
875 | + surface: model.window.surface |
876 | + } |
877 | + } |
878 | + } |
879 | + |
880 | + } |
881 | + |
882 | + Rectangle { |
883 | + anchors.fill: parent |
884 | + border.color: UbuntuColors.ash |
885 | + border.width: units.gu(.5) |
886 | + color: "transparent" |
887 | + visible: previewSpace.isActive |
888 | + } |
889 | + |
890 | + Rectangle { |
891 | + anchors.fill: parent |
892 | + border.color: UbuntuColors.blue |
893 | + border.width: units.gu(.5) |
894 | + color: "transparent" |
895 | + visible: previewSpace.isSelected |
896 | + } |
897 | + |
898 | + Rectangle { |
899 | + anchors.fill: parent |
900 | + anchors.rightMargin: parent.width / 2 |
901 | + color: "#55000000" |
902 | + visible: previewSpace.containsDragLeft |
903 | + |
904 | + Column { |
905 | + anchors.centerIn: parent |
906 | + spacing: units.gu(1) |
907 | + Icon { |
908 | + source: "../graphics/multi-monitor_drop-here.png" |
909 | + height: units.gu(4) |
910 | + width: height |
911 | + anchors.horizontalCenter: parent.horizontalCenter |
912 | + } |
913 | + Label { |
914 | + text: qsTr("Drop here") |
915 | + } |
916 | + } |
917 | + } |
918 | + |
919 | + Rectangle { |
920 | + anchors.fill: parent |
921 | + anchors.leftMargin: parent.width / 2 |
922 | + color: "#55000000" |
923 | + visible: previewSpace.containsDragRight |
924 | + |
925 | + Column { |
926 | + anchors.centerIn: parent |
927 | + spacing: units.gu(1) |
928 | + Icon { |
929 | + source: "../graphics/multi-monitor_leave.png" |
930 | + height: units.gu(4) |
931 | + width: height |
932 | + anchors.horizontalCenter: parent.horizontalCenter |
933 | + } |
934 | + Label { |
935 | + text: qsTr("Drop and go") |
936 | + } |
937 | + } |
938 | + } |
939 | +} |
940 | |
941 | === added file 'qml/Stage/Spread/Workspaces.qml' |
942 | --- qml/Stage/Spread/Workspaces.qml 1970-01-01 00:00:00 +0000 |
943 | +++ qml/Stage/Spread/Workspaces.qml 2017-04-06 12:58:37 +0000 |
944 | @@ -0,0 +1,412 @@ |
945 | +import QtQuick 2.4 |
946 | +import Ubuntu.Components 1.3 |
947 | +import WindowManager 1.0 |
948 | +import "MathUtils.js" as MathUtils |
949 | +import "../../Components" |
950 | + |
951 | +Item { |
952 | + id: root |
953 | + implicitWidth: listView.contentWidth |
954 | + readonly property int minimumWidth: { |
955 | + var count = Math.min(3, listView.count); |
956 | + return listView.itemWidth * count + listView.spacing * (count - 1) |
957 | + } |
958 | + |
959 | + property QtObject screen: null |
960 | + property alias workspaceModel: listView.model |
961 | + property var background // TODO: should be stored in the workspace data |
962 | + property int selectedIndex: -1 |
963 | + property bool readOnly: true |
964 | + property var activeWorkspace: null |
965 | + |
966 | + signal commitScreenSetup(); |
967 | + signal closeSpread(); |
968 | + signal clicked(var workspace); |
969 | + |
970 | + DropArea { |
971 | + anchors.fill: root |
972 | + |
973 | + keys: ['workspace'] |
974 | + |
975 | + onEntered: { |
976 | + var index = listView.getDropIndex(drag); |
977 | + drag.source.workspace.assign(workspaceModel, index) |
978 | + drag.source.inDropArea = true; |
979 | + } |
980 | + |
981 | + onPositionChanged: { |
982 | + var index = listView.getDropIndex(drag); |
983 | + if (listView.dropItemIndex == index) return; |
984 | + listView.model.move(listView.dropItemIndex, index, 1); |
985 | + listView.dropItemIndex = index; |
986 | + } |
987 | + |
988 | + onExited: { |
989 | + drag.source.workspace.unassign() |
990 | + listView.dropItemIndex = -1; |
991 | + listView.hoveredWorkspaceIndex = -1; |
992 | + drag.source.inDropArea = false; |
993 | + } |
994 | + |
995 | + onDropped: { |
996 | + drop.accept(Qt.MoveAction); |
997 | + listView.dropItemIndex = -1; |
998 | + drag.source.inDropArea = false; |
999 | + } |
1000 | + } |
1001 | + DropArea { |
1002 | + anchors.fill: parent |
1003 | + keys: ["application"] |
1004 | + |
1005 | + onPositionChanged: { |
1006 | + listView.progressiveScroll(drag.x) |
1007 | + listView.updateDropProperties(drag) |
1008 | + } |
1009 | + onExited: { |
1010 | + listView.hoveredWorkspaceIndex = -1 |
1011 | + } |
1012 | + onDropped: { |
1013 | + var surface = drag.source.surface; |
1014 | + drag.source.surface = null; |
1015 | + var workspace = listView.model.get(listView.hoveredWorkspaceIndex); |
1016 | + WorkspaceManager.moveSurfaceToWorkspace(surface, workspace); |
1017 | + drop.accept(Qt.MoveAction) |
1018 | + if (listView.hoveredHalf == "right") { |
1019 | + root.closeSpread(); |
1020 | + workspace.activate(); |
1021 | + } |
1022 | + surface.activate(); |
1023 | + listView.hoveredWorkspaceIndex = -1 |
1024 | + } |
1025 | + } |
1026 | + |
1027 | + onSelectedIndexChanged: { |
1028 | + listView.positionViewAtIndex(selectedIndex, ListView.Center); |
1029 | + } |
1030 | + |
1031 | + Item { |
1032 | + // We need to clip the listview as it has left/right margins and it would |
1033 | + // overlap with items next to it and eat mouse input. However, we can't |
1034 | + // just clip at the actual bounds as the delegates have the close button |
1035 | + // on hover which reaches a bit outside, so lets some margins for the clipping |
1036 | + anchors.fill: parent |
1037 | + anchors.margins: -units.gu(2) |
1038 | + clip: true |
1039 | + |
1040 | + |
1041 | + ListView { |
1042 | + id: listView |
1043 | + anchors { |
1044 | + fill: parent |
1045 | + topMargin: -parent.anchors.margins |
1046 | + bottomMargin: -parent.anchors.margins |
1047 | + leftMargin: -itemWidth - parent.anchors.margins |
1048 | + rightMargin: -itemWidth - parent.anchors.margins |
1049 | + } |
1050 | + boundsBehavior: Flickable.StopAtBounds |
1051 | + |
1052 | + Behavior on contentX { |
1053 | + SmoothedAnimation { duration: 200 } |
1054 | + } |
1055 | + |
1056 | + property var clickedWorkspace: null |
1057 | + |
1058 | + orientation: ListView.Horizontal |
1059 | + spacing: units.gu(1) |
1060 | + leftMargin: itemWidth |
1061 | + rightMargin: itemWidth |
1062 | + |
1063 | + property int screenWidth: screen.availableModes[screen.currentModeIndex].size.width |
1064 | + property int screenHeight: screen.availableModes[screen.currentModeIndex].size.height |
1065 | + property int itemWidth: height * screenWidth / screenHeight |
1066 | + property int foldingAreaWidth: itemWidth / 2 |
1067 | + property int maxAngle: 40 |
1068 | + |
1069 | + property real realContentX: contentX - originX + leftMargin |
1070 | + property int dropItemIndex: -1 |
1071 | + property int hoveredWorkspaceIndex: -1 |
1072 | + property string hoveredHalf: "" // left or right |
1073 | + |
1074 | + function getDropIndex(drag) { |
1075 | + var coords = mapToItem(listView.contentItem, drag.x, drag.y) |
1076 | + var index = Math.floor((drag.x + listView.realContentX) / (listView.itemWidth + listView.spacing)); |
1077 | + if (index < 0) index = 0; |
1078 | + var upperLimit = dropItemIndex == -1 ? listView.count : listView.count - 1 |
1079 | + if (index > upperLimit) index = upperLimit; |
1080 | + return index; |
1081 | + } |
1082 | + |
1083 | + function updateDropProperties(drag) { |
1084 | + var coords = mapToItem(listView.contentItem, drag.x, drag.y) |
1085 | + var index = Math.floor(drag.x + listView.realContentX) / (listView.itemWidth + listView.spacing); |
1086 | + if (index < 0) { |
1087 | + listView.hoveredWorkspaceIndex = -1; |
1088 | + listView.hoveredHalf = ""; |
1089 | + return; |
1090 | + } |
1091 | + |
1092 | + var upperLimit = dropItemIndex == -1 ? listView.count : listView.count - 1 |
1093 | + if (index > upperLimit) index = upperLimit; |
1094 | + listView.hoveredWorkspaceIndex = index; |
1095 | + var pixelsInTile = (drag.x + listView.realContentX) % (listView.itemWidth + listView.spacing); |
1096 | + listView.hoveredHalf = (pixelsInTile / listView.itemWidth) < .5 ? "left" : "right"; |
1097 | + } |
1098 | + |
1099 | + function progressiveScroll(mouseX) { |
1100 | + var progress = Math.max(0, Math.min(1, (mouseX - listView.itemWidth) / (width - listView.leftMargin * 2 - listView.itemWidth * 2))) |
1101 | + listView.contentX = listView.originX + (listView.contentWidth - listView.width + listView.leftMargin + listView.rightMargin) * progress - listView.leftMargin |
1102 | + } |
1103 | + |
1104 | + displaced: Transition { UbuntuNumberAnimation { properties: "x" } } |
1105 | + |
1106 | + delegate: Item { |
1107 | + id: workspaceDelegate |
1108 | + objectName: "delegate" + index |
1109 | + height: parent.height |
1110 | + width: listView.itemWidth |
1111 | + Behavior on width { UbuntuNumberAnimation {} } |
1112 | + visible: listView.dropItemIndex !== index |
1113 | + |
1114 | + property int itemX: -listView.realContentX + index * (listView.itemWidth + listView.spacing) |
1115 | + property int distanceFromLeft: itemX //- listView.leftMargin |
1116 | + property int distanceFromRight: listView.width - listView.leftMargin - listView.rightMargin - itemX - listView.itemWidth |
1117 | + |
1118 | + property int itemAngle: { |
1119 | + if (index == 0) { |
1120 | + if (distanceFromLeft < 0) { |
1121 | + var progress = (distanceFromLeft + listView.foldingAreaWidth) / listView.foldingAreaWidth |
1122 | + return MathUtils.linearAnimation(1, -1, 0, listView.maxAngle, Math.max(-1, Math.min(1, progress))); |
1123 | + } |
1124 | + return 0 |
1125 | + } |
1126 | + if (index == listView.count - 1) { |
1127 | + if (distanceFromRight < 0) { |
1128 | + var progress = (distanceFromRight + listView.foldingAreaWidth) / listView.foldingAreaWidth |
1129 | + return MathUtils.linearAnimation(1, -1, 0, -listView.maxAngle, Math.max(-1, Math.min(1, progress))); |
1130 | + } |
1131 | + return 0 |
1132 | + } |
1133 | + |
1134 | + if (distanceFromLeft < listView.foldingAreaWidth) { |
1135 | + // itemX : 10gu = p : 100 |
1136 | + var progress = distanceFromLeft / listView.foldingAreaWidth |
1137 | + return MathUtils.linearAnimation(1, -1, 0, listView.maxAngle, Math.max(-1, Math.min(1, progress))); |
1138 | + } |
1139 | + if (distanceFromRight < listView.foldingAreaWidth) { |
1140 | + var progress = distanceFromRight / listView.foldingAreaWidth |
1141 | + return MathUtils.linearAnimation(1, -1, 0, -listView.maxAngle, Math.max(-1, Math.min(1, progress))); |
1142 | + } |
1143 | + return 0 |
1144 | + } |
1145 | + |
1146 | + property int itemOffset: { |
1147 | + if (index == 0) { |
1148 | + if (distanceFromLeft < 0) { |
1149 | + return -distanceFromLeft |
1150 | + } |
1151 | + return 0 |
1152 | + } |
1153 | + if (index == listView.count - 1) { |
1154 | + if (distanceFromRight < 0) { |
1155 | + return distanceFromRight |
1156 | + } |
1157 | + return 0 |
1158 | + } |
1159 | + |
1160 | + if (itemX < -listView.foldingAreaWidth) { |
1161 | + return -itemX |
1162 | + } |
1163 | + if (distanceFromLeft < listView.foldingAreaWidth) { |
1164 | + return (listView.foldingAreaWidth - distanceFromLeft) / 2 |
1165 | + } |
1166 | + |
1167 | + if (distanceFromRight < -listView.foldingAreaWidth) { |
1168 | + return distanceFromRight |
1169 | + } |
1170 | + |
1171 | + if (distanceFromRight < listView.foldingAreaWidth) { |
1172 | + return -(listView.foldingAreaWidth - distanceFromRight) / 2 |
1173 | + } |
1174 | + |
1175 | + return 0 |
1176 | + } |
1177 | + |
1178 | + z: itemOffset < 0 ? itemOffset : -itemOffset |
1179 | + transform: [ |
1180 | + Rotation { |
1181 | + angle: itemAngle |
1182 | + axis { x: 0; y: 1; z: 0 } |
1183 | + origin { x: itemAngle < 0 ? listView.itemWidth : 0; y: height / 2 } |
1184 | + }, |
1185 | + Translate { |
1186 | + x: itemOffset |
1187 | + } |
1188 | + ] |
1189 | + |
1190 | + WorkspacePreview { |
1191 | + id: workspacePreview |
1192 | + height: listView.height |
1193 | + width: listView.itemWidth |
1194 | + background: root.background |
1195 | + screenHeight: listView.screenHeight |
1196 | + containsDragLeft: listView.hoveredWorkspaceIndex == index && listView.hoveredHalf == "left" |
1197 | + containsDragRight: listView.hoveredWorkspaceIndex == index && listView.hoveredHalf == "right" |
1198 | + isActive: workspace.isSameAs(root.activeWorkspace) |
1199 | + isSelected: index === root.selectedIndex |
1200 | + workspace: model.workspace |
1201 | + } |
1202 | + MouseArea { |
1203 | + anchors.fill: parent |
1204 | + onClicked: { |
1205 | + root.clicked(model.workspace) |
1206 | + } |
1207 | + onDoubleClicked: { |
1208 | + model.workspace.activate(); |
1209 | + root.closeSpread(); |
1210 | + } |
1211 | + } |
1212 | + |
1213 | + MouseArea { |
1214 | + id: closeMouseArea |
1215 | + objectName: "closeMouseArea" |
1216 | + anchors { left: parent.left; top: parent.top; leftMargin: -height / 2; topMargin: -height / 2 } |
1217 | + hoverEnabled: true |
1218 | + height: units.gu(4) |
1219 | + width: height |
1220 | + visible: !root.readOnly && listView.count > 1 |
1221 | + |
1222 | + onClicked: { |
1223 | + model.workspace.unassign(); |
1224 | + root.commitScreenSetup(); |
1225 | + } |
1226 | + Image { |
1227 | + id: closeImage |
1228 | + source: "../graphics/window-close.svg" |
1229 | + anchors.fill: closeMouseArea |
1230 | + anchors.margins: units.gu(1) |
1231 | + sourceSize.width: width |
1232 | + sourceSize.height: height |
1233 | + readonly property var mousePos: hoverMouseArea.mapToItem(workspaceDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY) |
1234 | + readonly property bool shown: (hoverMouseArea.containsMouse || parent.containsMouse) |
1235 | + && mousePos.y < workspaceDelegate.width / 4 |
1236 | + && mousePos.y > -units.gu(2) |
1237 | + && mousePos.x > -units.gu(2) |
1238 | + && mousePos.x < workspaceDelegate.height / 4 |
1239 | + opacity: shown ? 1 : 0 |
1240 | + visible: opacity > 0 |
1241 | + Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } } |
1242 | + |
1243 | + } |
1244 | + } |
1245 | + } |
1246 | + |
1247 | + MouseArea { |
1248 | + id: hoverMouseArea |
1249 | + anchors.fill: parent |
1250 | + hoverEnabled: true |
1251 | + propagateComposedEvents: true |
1252 | + anchors.leftMargin: listView.leftMargin |
1253 | + anchors.rightMargin: listView.rightMargin |
1254 | + enabled: !root.readOnly |
1255 | + |
1256 | + property int draggedIndex: -1 |
1257 | + |
1258 | + property int startX: 0 |
1259 | + property int startY: 0 |
1260 | + |
1261 | + onMouseXChanged: { |
1262 | + if (!pressed || dragging) { |
1263 | + listView.progressiveScroll(mouseX) |
1264 | + } |
1265 | + } |
1266 | + onMouseYChanged: { |
1267 | + if (Math.abs(mouseY - startY) > units.gu(3)) { |
1268 | + drag.axis = Drag.XAndYAxis; |
1269 | + } |
1270 | + } |
1271 | + |
1272 | + onReleased: { |
1273 | + var result = fakeDragItem.Drag.drop(); |
1274 | + // if (result == Qt.IgnoreAction) { |
1275 | + // WorkspaceManager.destroyWorkspace(fakeDragItem.workspace); |
1276 | + // } |
1277 | + root.commitScreenSetup(); |
1278 | + drag.target = null; |
1279 | + } |
1280 | + |
1281 | + property bool dragging: drag.active |
1282 | + onDraggingChanged: { |
1283 | + if (drag.active) { |
1284 | + var ws = listView.model.get(draggedIndex); |
1285 | + if (ws) ws.unassign(); |
1286 | + } |
1287 | + } |
1288 | + |
1289 | + onPressed: { |
1290 | + startX = mouseX; |
1291 | + startY = mouseY; |
1292 | + if (listView.model.count < 2) return; |
1293 | + |
1294 | + var coords = mapToItem(listView.contentItem, mouseX, mouseY) |
1295 | + draggedIndex = listView.indexAt(coords.x, coords.y) |
1296 | + var clickedItem = listView.itemAt(coords.x, coords.y) |
1297 | + |
1298 | + var itemCoords = clickedItem.mapToItem(listView, -listView.leftMargin, 0); |
1299 | + fakeDragItem.x = itemCoords.x |
1300 | + fakeDragItem.y = itemCoords.y |
1301 | + fakeDragItem.workspace = listView.model.get(draggedIndex) |
1302 | + |
1303 | + var mouseCoordsInItem = mapToItem(clickedItem, mouseX, mouseY); |
1304 | + fakeDragItem.Drag.hotSpot.x = mouseCoordsInItem.x |
1305 | + fakeDragItem.Drag.hotSpot.y = mouseCoordsInItem.y |
1306 | + |
1307 | + drag.axis = Drag.YAxis; |
1308 | + drag.target = fakeDragItem; |
1309 | + } |
1310 | + |
1311 | + WorkspacePreview { |
1312 | + id: fakeDragItem |
1313 | + height: listView.height |
1314 | + width: listView.itemWidth |
1315 | + background: root.background |
1316 | + screenHeight: screen.availableModes[screen.currentModeIndex].size.height |
1317 | + visible: Drag.active |
1318 | + |
1319 | + Drag.active: hoverMouseArea.drag.active |
1320 | + Drag.keys: ['workspace'] |
1321 | + |
1322 | + property bool inDropArea: false |
1323 | + |
1324 | + Rectangle { |
1325 | + anchors.fill: parent |
1326 | + color: "#33000000" |
1327 | + opacity: parent.inDropArea ? 0 : 1 |
1328 | + Behavior on opacity { UbuntuNumberAnimation { } } |
1329 | + Rectangle { |
1330 | + anchors.centerIn: parent |
1331 | + width: units.gu(6) |
1332 | + height: units.gu(6) |
1333 | + radius: width / 2 |
1334 | + color: "#aa000000" |
1335 | + } |
1336 | + |
1337 | + Icon { |
1338 | + height: units.gu(3) |
1339 | + width: height |
1340 | + anchors.centerIn: parent |
1341 | + name: "edit-delete" |
1342 | + color: "white" |
1343 | + } |
1344 | + } |
1345 | + |
1346 | + states: [ |
1347 | + State { |
1348 | + when: fakeDragItem.Drag.active |
1349 | + ParentChange { target: fakeDragItem; parent: shell } |
1350 | + } |
1351 | + ] |
1352 | + } |
1353 | + } |
1354 | + } |
1355 | + } |
1356 | +} |
1357 | |
1358 | === modified file 'qml/Stage/Stage.qml' |
1359 | --- qml/Stage/Stage.qml 2017-04-06 12:58:36 +0000 |
1360 | +++ qml/Stage/Stage.qml 2017-04-06 12:58:37 +0000 |
1361 | @@ -50,6 +50,8 @@ |
1362 | property Item availableDesktopArea |
1363 | property PanelState panelState |
1364 | |
1365 | + readonly property var temporarySelectedWorkspace: state == "spread" ? screensAndWorkspaces.activeWorkspace : null |
1366 | + |
1367 | // Configuration |
1368 | property string mode: "staged" |
1369 | |
1370 | @@ -138,6 +140,7 @@ |
1371 | function updateFocusedAppOrientationAnimated() { /* TODO */} |
1372 | |
1373 | function closeSpread() { |
1374 | + spreadItem.highlightedIndex = -1; |
1375 | priv.goneToSpread = false; |
1376 | } |
1377 | |
1378 | @@ -244,6 +247,43 @@ |
1379 | } |
1380 | } |
1381 | |
1382 | + GlobalShortcut { |
1383 | + id: showWorkspaceSwitcherShortcutLeft |
1384 | + shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Left |
1385 | + active: !workspaceSwitcher.active |
1386 | + onTriggered: { |
1387 | + root.focus = true; |
1388 | + workspaceSwitcher.showLeft() |
1389 | + } |
1390 | + } |
1391 | + GlobalShortcut { |
1392 | + id: showWorkspaceSwitcherShortcutRight |
1393 | + shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Right |
1394 | + active: !workspaceSwitcher.active |
1395 | + onTriggered: { |
1396 | + root.focus = true; |
1397 | + workspaceSwitcher.showRight() |
1398 | + } |
1399 | + } |
1400 | + GlobalShortcut { |
1401 | + id: showWorkspaceSwitcherShortcutUp |
1402 | + shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Up |
1403 | + active: !workspaceSwitcher.active |
1404 | + onTriggered: { |
1405 | + root.focus = true; |
1406 | + workspaceSwitcher.showUp() |
1407 | + } |
1408 | + } |
1409 | + GlobalShortcut { |
1410 | + id: showWorkspaceSwitcherShortcutDown |
1411 | + shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Down |
1412 | + active: !workspaceSwitcher.active |
1413 | + onTriggered: { |
1414 | + root.focus = true; |
1415 | + workspaceSwitcher.showDown() |
1416 | + } |
1417 | + } |
1418 | + |
1419 | QtObject { |
1420 | id: priv |
1421 | objectName: "DesktopStagePrivate" |
1422 | @@ -379,7 +419,7 @@ |
1423 | readonly property real windowDecorationHeight: units.gu(3) |
1424 | } |
1425 | |
1426 | - Component.onCompleted: priv.updateMainAndSideStageIndexes(); |
1427 | + Component.onCompleted: priv.updateMainAndSideStageIndexes() |
1428 | |
1429 | Connections { |
1430 | target: panelState |
1431 | @@ -484,6 +524,7 @@ |
1432 | PropertyChanges { target: cancelSpreadMouseArea; enabled: true } |
1433 | PropertyChanges { target: blurLayer; visible: true; blurRadius: 32; brightness: .65; opacity: 1 } |
1434 | PropertyChanges { target: wallpaper; visible: false } |
1435 | + PropertyChanges { target: screensAndWorkspaces; opacity: 1 } |
1436 | }, |
1437 | State { |
1438 | name: "stagedRightEdge"; when: root.spreadEnabled && (rightEdgeDragArea.dragging || rightEdgePushProgress > 0) && root.mode == "staged" |
1439 | @@ -531,11 +572,16 @@ |
1440 | Transition { |
1441 | from: "stagedRightEdge,sideStagedRightEdge,windowedRightEdge"; to: "spread" |
1442 | PropertyAction { target: spreadItem; property: "highlightedIndex"; value: -1 } |
1443 | + PropertyAction { target: screensAndWorkspaces; property: "activeWorkspace"; value: WMScreen.currentWorkspace } |
1444 | PropertyAnimation { target: blurLayer; properties: "brightness,blurRadius"; duration: priv.animationDuration } |
1445 | + UbuntuNumberAnimation { target: screensAndWorkspaces; property: "opacity"; duration: priv.animationDuration } |
1446 | }, |
1447 | Transition { |
1448 | to: "spread" |
1449 | + PropertyAction { target: screensAndWorkspaces; property: "activeWorkspace"; value: WMScreen.currentWorkspace } |
1450 | PropertyAction { target: spreadItem; property: "highlightedIndex"; value: appRepeater.count > 1 ? 1 : 0 } |
1451 | + PropertyAction { target: floatingFlickable; property: "contentX"; value: 0 } |
1452 | + UbuntuNumberAnimation { target: screensAndWorkspaces; property: "opacity"; duration: priv.animationDuration } |
1453 | }, |
1454 | Transition { |
1455 | from: "spread" |
1456 | @@ -593,10 +639,20 @@ |
1457 | visible: false |
1458 | } |
1459 | |
1460 | + ScreensAndWorkspaces { |
1461 | + id: screensAndWorkspaces |
1462 | + anchors { left: parent.left; top: parent.top; right: parent.right; leftMargin: root.leftMargin } |
1463 | + height: Math.max(units.gu(30), parent.height * .3) |
1464 | + background: root.background |
1465 | + opacity: 0 |
1466 | + visible: opacity > 0 |
1467 | + onCloseSpread: priv.goneToSpread = false; |
1468 | + } |
1469 | + |
1470 | Spread { |
1471 | id: spreadItem |
1472 | objectName: "spreadItem" |
1473 | - anchors.fill: appContainer |
1474 | + anchors { left: parent.left; bottom: parent.bottom; right: parent.right; top: screensAndWorkspaces.bottom } |
1475 | leftMargin: root.availableDesktopArea.x |
1476 | model: root.topLevelSurfaceList |
1477 | spreadFlickable: floatingFlickable |
1478 | @@ -611,6 +667,83 @@ |
1479 | appRepeater.itemAt(highlightedIndex).close(); |
1480 | } |
1481 | } |
1482 | + |
1483 | + FloatingFlickable { |
1484 | + id: floatingFlickable |
1485 | + objectName: "spreadFlickable" |
1486 | + anchors.fill: parent |
1487 | + enabled: false |
1488 | + contentWidth: spreadItem.spreadTotalWidth |
1489 | + |
1490 | + function snap(toIndex) { |
1491 | + var delegate = appRepeater.itemAt(toIndex) |
1492 | + var targetContentX = floatingFlickable.contentWidth / spreadItem.totalItemCount * toIndex; |
1493 | + if (targetContentX - floatingFlickable.contentX > spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) { |
1494 | + var offset = (spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) - (targetContentX - floatingFlickable.contentX) |
1495 | + snapAnimation.to = floatingFlickable.contentX - offset; |
1496 | + snapAnimation.start(); |
1497 | + } else if (targetContentX - floatingFlickable.contentX < spreadItem.leftStackXPos + units.gu(1)) { |
1498 | + var offset = (spreadItem.leftStackXPos + units.gu(1)) - (targetContentX - floatingFlickable.contentX); |
1499 | + snapAnimation.to = floatingFlickable.contentX - offset; |
1500 | + snapAnimation.start(); |
1501 | + } |
1502 | + } |
1503 | + UbuntuNumberAnimation {id: snapAnimation; target: floatingFlickable; property: "contentX"} |
1504 | + } |
1505 | + |
1506 | + MouseArea { |
1507 | + id: hoverMouseArea |
1508 | + objectName: "hoverMouseArea" |
1509 | + anchors.fill: parent |
1510 | + propagateComposedEvents: true |
1511 | + hoverEnabled: true |
1512 | + enabled: false |
1513 | + visible: enabled |
1514 | + |
1515 | + property int scrollAreaWidth: width / 3 |
1516 | + property bool progressiveScrollingEnabled: false |
1517 | + |
1518 | + onPressed: mouse.accepted = false |
1519 | + |
1520 | + onMouseXChanged: { |
1521 | + mouse.accepted = false |
1522 | + |
1523 | + if (hoverMouseArea.pressed) { |
1524 | + return; |
1525 | + } |
1526 | + |
1527 | + // Find the hovered item and mark it active |
1528 | + for (var i = appRepeater.count - 1; i >= 0; i--) { |
1529 | + var appDelegate = appRepeater.itemAt(i); |
1530 | + var mapped = mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY) |
1531 | + var itemUnder = appDelegate.childAt(mapped.x, mapped.y); |
1532 | + if (itemUnder && (itemUnder.objectName === "dragArea" || itemUnder.objectName === "windowInfoItem" || itemUnder.objectName == "closeMouseArea")) { |
1533 | + spreadItem.highlightedIndex = i; |
1534 | + break; |
1535 | + } |
1536 | + } |
1537 | + |
1538 | + if (floatingFlickable.contentWidth > floatingFlickable.width) { |
1539 | + var margins = floatingFlickable.width * 0.05; |
1540 | + |
1541 | + if (!progressiveScrollingEnabled && mouseX < floatingFlickable.width - scrollAreaWidth) { |
1542 | + progressiveScrollingEnabled = true |
1543 | + } |
1544 | + |
1545 | + // do we need to scroll? |
1546 | + if (mouseX < scrollAreaWidth + margins) { |
1547 | + var progress = Math.min(1, (scrollAreaWidth + margins - mouseX) / (scrollAreaWidth - margins)); |
1548 | + var contentX = (1 - progress) * (floatingFlickable.contentWidth - floatingFlickable.width) |
1549 | + floatingFlickable.contentX = Math.max(0, Math.min(floatingFlickable.contentX, contentX)) |
1550 | + } |
1551 | + if (mouseX > floatingFlickable.width - scrollAreaWidth && progressiveScrollingEnabled) { |
1552 | + var progress = Math.min(1, (mouseX - (floatingFlickable.width - scrollAreaWidth)) / (scrollAreaWidth - margins)) |
1553 | + var contentX = progress * (floatingFlickable.contentWidth - floatingFlickable.width) |
1554 | + floatingFlickable.contentX = Math.min(floatingFlickable.contentWidth - floatingFlickable.width, Math.max(floatingFlickable.contentX, contentX)) |
1555 | + } |
1556 | + } |
1557 | + } |
1558 | + } |
1559 | } |
1560 | |
1561 | Connections { |
1562 | @@ -705,6 +838,24 @@ |
1563 | } |
1564 | } |
1565 | |
1566 | + MirSurfaceItem { |
1567 | + id: fakeDragItem |
1568 | + property real previewScale: .5 |
1569 | + height: (screensAndWorkspaces.height - units.gu(8)) / 2 |
1570 | + // w : h = iw : ih |
1571 | + width: implicitWidth * height / implicitHeight |
1572 | + surfaceWidth: -1 |
1573 | + surfaceHeight: -1 |
1574 | + opacity: surface != null ? 1 : 0 |
1575 | + Behavior on opacity { UbuntuNumberAnimation {} } |
1576 | + visible: opacity > 0 |
1577 | + |
1578 | + Drag.active: surface != null |
1579 | + Drag.keys: ["application"] |
1580 | + |
1581 | + z: 1000 |
1582 | + } |
1583 | + |
1584 | Repeater { |
1585 | id: appRepeater |
1586 | model: topLevelSurfaceList |
1587 | @@ -733,6 +884,9 @@ |
1588 | } |
1589 | z: normalZ |
1590 | |
1591 | + opacity: fakeDragItem.surface == model.window.surface && fakeDragItem.Drag.active ? 0 : 1 |
1592 | + Behavior on opacity { UbuntuNumberAnimation {} } |
1593 | + |
1594 | // Normally we want x/y where the surface thinks it is. Width/height of our delegate will |
1595 | // match what the actual surface size is. |
1596 | // Don't write to those, they will be set by states |
1597 | @@ -913,7 +1067,6 @@ |
1598 | function claimFocus() { |
1599 | if (root.state == "spread") { |
1600 | spreadItem.highlightedIndex = index |
1601 | - priv.goneToSpread = false; |
1602 | } |
1603 | if (root.mode == "stagedWithSideStage") { |
1604 | if (appDelegate.stage == ApplicationInfoInterface.SideStage && !sideStage.shown) { |
1605 | @@ -1247,8 +1400,6 @@ |
1606 | y: spreadMaths.targetY |
1607 | z: index |
1608 | height: spreadItem.spreadItemHeight |
1609 | - requestedWidth: decoratedWindow.oldRequestedWidth |
1610 | - requestedHeight: decoratedWindow.oldRequestedHeight |
1611 | visible: spreadMaths.itemVisible |
1612 | } |
1613 | PropertyChanges { target: dragArea; enabled: true } |
1614 | @@ -1268,8 +1419,6 @@ |
1615 | y: stagedRightEdgeMaths.animatedY |
1616 | z: stagedRightEdgeMaths.animatedZ |
1617 | height: stagedRightEdgeMaths.animatedHeight |
1618 | - requestedWidth: decoratedWindow.oldRequestedWidth |
1619 | - requestedHeight: decoratedWindow.oldRequestedHeight |
1620 | visible: appDelegate.x < root.width |
1621 | } |
1622 | PropertyChanges { |
1623 | @@ -1299,8 +1448,6 @@ |
1624 | y: windowedRightEdgeMaths.animatedY |
1625 | z: windowedRightEdgeMaths.animatedZ |
1626 | height: stagedRightEdgeMaths.animatedHeight |
1627 | - requestedWidth: decoratedWindow.oldRequestedWidth |
1628 | - requestedHeight: decoratedWindow.oldRequestedHeight |
1629 | } |
1630 | PropertyChanges { |
1631 | target: decoratedWindow |
1632 | @@ -1323,10 +1470,14 @@ |
1633 | target: appDelegate |
1634 | x: stageMaths.itemX |
1635 | y: root.availableDesktopArea.y |
1636 | + visuallyMaximized: true |
1637 | + visible: appDelegate.x < root.width |
1638 | + } |
1639 | + PropertyChanges { |
1640 | + target: appDelegate |
1641 | requestedWidth: appContainer.width |
1642 | requestedHeight: root.availableDesktopArea.height |
1643 | - visuallyMaximized: true |
1644 | - visible: appDelegate.x < root.width |
1645 | + restoreEntryValues: false |
1646 | } |
1647 | PropertyChanges { |
1648 | target: decoratedWindow |
1649 | @@ -1356,10 +1507,14 @@ |
1650 | x: stageMaths.itemX |
1651 | y: root.availableDesktopArea.y |
1652 | z: stageMaths.itemZ |
1653 | + visuallyMaximized: true |
1654 | + visible: appDelegate.x < root.width |
1655 | + } |
1656 | + PropertyChanges { |
1657 | + target: appDelegate |
1658 | requestedWidth: stageMaths.itemWidth |
1659 | requestedHeight: root.availableDesktopArea.height |
1660 | - visuallyMaximized: true |
1661 | - visible: appDelegate.x < root.width |
1662 | + restoreEntryValues: false |
1663 | } |
1664 | PropertyChanges { |
1665 | target: decoratedWindow |
1666 | @@ -1382,8 +1537,12 @@ |
1667 | requestedY: 0; |
1668 | visuallyMinimized: false; |
1669 | visuallyMaximized: true |
1670 | + } |
1671 | + PropertyChanges { |
1672 | + target: appDelegate |
1673 | requestedWidth: root.availableDesktopArea.width; |
1674 | requestedHeight: appContainer.height; |
1675 | + restoreEntryValues: false |
1676 | } |
1677 | PropertyChanges { target: touchControls; enabled: true } |
1678 | }, |
1679 | @@ -1393,8 +1552,12 @@ |
1680 | target: appDelegate; |
1681 | requestedX: 0 |
1682 | requestedY: 0 |
1683 | - requestedWidth: appContainer.width; |
1684 | - requestedHeight: appContainer.height; |
1685 | + } |
1686 | + PropertyChanges { |
1687 | + target: appDelegate |
1688 | + requestedWidth: appContainer.width |
1689 | + requestedHeight: appContainer.height |
1690 | + restoreEntryValues: false |
1691 | } |
1692 | PropertyChanges { target: decoratedWindow; hasDecoration: false } |
1693 | }, |
1694 | @@ -1409,6 +1572,12 @@ |
1695 | PropertyChanges { target: touchControls; enabled: true } |
1696 | PropertyChanges { target: resizeArea; enabled: true } |
1697 | PropertyChanges { target: decoratedWindow; shadowOpacity: .3} |
1698 | + PropertyChanges { |
1699 | + target: appDelegate |
1700 | + requestedWidth: windowedWidth |
1701 | + requestedHeight: windowedHeight |
1702 | + restoreEntryValues: false |
1703 | + } |
1704 | }, |
1705 | State { |
1706 | name: "restored"; |
1707 | @@ -1509,6 +1678,7 @@ |
1708 | } |
1709 | } |
1710 | ] |
1711 | + |
1712 | transitions: [ |
1713 | Transition { |
1714 | from: "staged,stagedWithSideStage" |
1715 | @@ -1522,6 +1692,7 @@ |
1716 | UbuntuNumberAnimation { target: appDelegate; properties: "x,y,requestedX,requestedY,requestedWidth,requestedHeight"; duration: priv.animationDuration} |
1717 | }, |
1718 | Transition { |
1719 | + from: "normal,restored,maximized,maximizedHorizontally,maximizedVertically,maximizedLeft,maximizedRight,maximizedTopLeft,maximizedBottomLeft,maximizedTopRight,maximizedBottomRight,staged,stagedWithSideStage,windowedRightEdge,stagedRightEdge"; |
1720 | to: "spread" |
1721 | // DecoratedWindow wants the scaleToPreviewSize set before enabling scaleToPreview |
1722 | PropertyAction { target: appDelegate; properties: "z,visible" } |
1723 | @@ -1628,6 +1799,7 @@ |
1724 | borderThickness: units.gu(2) |
1725 | enabled: false |
1726 | visible: enabled |
1727 | + readyToAssesBounds: !appDelegate._constructing |
1728 | |
1729 | onPressed: { |
1730 | appDelegate.activate(); |
1731 | @@ -1651,19 +1823,13 @@ |
1732 | width: implicitWidth |
1733 | height: implicitHeight |
1734 | highlightSize: windowInfoItem.iconMargin / 2 |
1735 | + boundsItem: root.availableDesktopArea |
1736 | + panelState: root.panelState |
1737 | altDragEnabled: root.mode == "windowed" |
1738 | - boundsItem: root.availableDesktopArea |
1739 | - panelState: root.panelState |
1740 | |
1741 | requestedWidth: appDelegate.requestedWidth |
1742 | requestedHeight: appDelegate.requestedHeight |
1743 | |
1744 | - property int oldRequestedWidth: -1 |
1745 | - property int oldRequestedHeight: -1 |
1746 | - |
1747 | - onRequestedWidthChanged: oldRequestedWidth = requestedWidth |
1748 | - onRequestedHeightChanged: oldRequestedHeight = requestedHeight |
1749 | - |
1750 | onCloseClicked: { appDelegate.close(); } |
1751 | onMaximizeClicked: { |
1752 | if (appDelegate.canBeMaximized) { |
1753 | @@ -1744,6 +1910,8 @@ |
1754 | anchors.fill: decoratedWindow |
1755 | enabled: false |
1756 | closeable: !appDelegate.isDash |
1757 | + stage: root |
1758 | + dragDelegate: fakeDragItem |
1759 | |
1760 | onClicked: { |
1761 | spreadItem.highlightedIndex = index; |
1762 | @@ -1786,12 +1954,15 @@ |
1763 | objectName: "closeMouseArea" |
1764 | anchors { left: parent.left; top: parent.top; leftMargin: -height / 2; topMargin: -height / 2 + spreadMaths.closeIconOffset } |
1765 | readonly property var mousePos: hoverMouseArea.mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY) |
1766 | - visible: !appDelegate.isDash && dragArea.distance == 0 |
1767 | + readonly property bool shown: !appDelegate.isDash && dragArea.distance == 0 |
1768 | && index == spreadItem.highlightedIndex |
1769 | && mousePos.y < (decoratedWindow.height / 3) |
1770 | && mousePos.y > -units.gu(4) |
1771 | && mousePos.x > -units.gu(4) |
1772 | && mousePos.x < (decoratedWindow.width * 2 / 3) |
1773 | + opacity: shown ? 1 : 0 |
1774 | + visible: opacity > 0 |
1775 | + Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } } |
1776 | height: units.gu(6) |
1777 | width: height |
1778 | |
1779 | @@ -1865,81 +2036,17 @@ |
1780 | panelState: root.panelState |
1781 | } |
1782 | |
1783 | - MouseArea { |
1784 | - id: hoverMouseArea |
1785 | - objectName: "hoverMouseArea" |
1786 | - anchors.fill: appContainer |
1787 | - propagateComposedEvents: true |
1788 | - hoverEnabled: true |
1789 | - enabled: false |
1790 | - visible: enabled |
1791 | - |
1792 | - property int scrollAreaWidth: width / 3 |
1793 | - property bool progressiveScrollingEnabled: false |
1794 | - |
1795 | - onMouseXChanged: { |
1796 | - mouse.accepted = false |
1797 | - |
1798 | - if (hoverMouseArea.pressed) { |
1799 | - return; |
1800 | - } |
1801 | - |
1802 | - // Find the hovered item and mark it active |
1803 | - for (var i = appRepeater.count - 1; i >= 0; i--) { |
1804 | - var appDelegate = appRepeater.itemAt(i); |
1805 | - var mapped = mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY) |
1806 | - var itemUnder = appDelegate.childAt(mapped.x, mapped.y); |
1807 | - if (itemUnder && (itemUnder.objectName === "dragArea" || itemUnder.objectName === "windowInfoItem" || itemUnder.objectName == "closeMouseArea")) { |
1808 | - spreadItem.highlightedIndex = i; |
1809 | - break; |
1810 | - } |
1811 | - } |
1812 | - |
1813 | - if (floatingFlickable.contentWidth > floatingFlickable.width) { |
1814 | - var margins = floatingFlickable.width * 0.05; |
1815 | - |
1816 | - if (!progressiveScrollingEnabled && mouseX < floatingFlickable.width - scrollAreaWidth) { |
1817 | - progressiveScrollingEnabled = true |
1818 | - } |
1819 | - |
1820 | - // do we need to scroll? |
1821 | - if (mouseX < scrollAreaWidth + margins) { |
1822 | - var progress = Math.min(1, (scrollAreaWidth + margins - mouseX) / (scrollAreaWidth - margins)); |
1823 | - var contentX = (1 - progress) * (floatingFlickable.contentWidth - floatingFlickable.width) |
1824 | - floatingFlickable.contentX = Math.max(0, Math.min(floatingFlickable.contentX, contentX)) |
1825 | - } |
1826 | - if (mouseX > floatingFlickable.width - scrollAreaWidth && progressiveScrollingEnabled) { |
1827 | - var progress = Math.min(1, (mouseX - (floatingFlickable.width - scrollAreaWidth)) / (scrollAreaWidth - margins)) |
1828 | - var contentX = progress * (floatingFlickable.contentWidth - floatingFlickable.width) |
1829 | - floatingFlickable.contentX = Math.min(floatingFlickable.contentWidth - floatingFlickable.width, Math.max(floatingFlickable.contentX, contentX)) |
1830 | - } |
1831 | - } |
1832 | - } |
1833 | - |
1834 | - onPressed: mouse.accepted = false |
1835 | - } |
1836 | - |
1837 | - FloatingFlickable { |
1838 | - id: floatingFlickable |
1839 | - objectName: "spreadFlickable" |
1840 | - anchors.fill: appContainer |
1841 | - enabled: false |
1842 | - contentWidth: spreadItem.spreadTotalWidth |
1843 | - |
1844 | - function snap(toIndex) { |
1845 | - var delegate = appRepeater.itemAt(toIndex) |
1846 | - var targetContentX = floatingFlickable.contentWidth / spreadItem.totalItemCount * toIndex; |
1847 | - if (targetContentX - floatingFlickable.contentX > spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) { |
1848 | - var offset = (spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) - (targetContentX - floatingFlickable.contentX) |
1849 | - snapAnimation.to = Math.max(0, floatingFlickable.contentX - offset); |
1850 | - snapAnimation.start(); |
1851 | - } else if (targetContentX - floatingFlickable.contentX < spreadItem.leftStackXPos + units.gu(1)) { |
1852 | - var offset = (spreadItem.leftStackXPos + units.gu(1)) - (targetContentX - floatingFlickable.contentX); |
1853 | - snapAnimation.to = Math.max(0, floatingFlickable.contentX - offset); |
1854 | - snapAnimation.start(); |
1855 | - } |
1856 | - } |
1857 | - UbuntuNumberAnimation {id: snapAnimation; target: floatingFlickable; property: "contentX"} |
1858 | + WorkspaceSwitcher { |
1859 | + id: workspaceSwitcher |
1860 | + anchors.centerIn: parent |
1861 | + height: units.gu(20) |
1862 | + width: root.width - units.gu(8) |
1863 | + background: root.background |
1864 | + onActiveChanged: { |
1865 | + if (!active) { |
1866 | + appContainer.focus = true; |
1867 | + } |
1868 | + } |
1869 | } |
1870 | |
1871 | PropertyAnimation { |
1872 | |
1873 | === modified file 'qml/Stage/WindowResizeArea.qml' |
1874 | --- qml/Stage/WindowResizeArea.qml 2017-02-21 15:19:01 +0000 |
1875 | +++ qml/Stage/WindowResizeArea.qml 2017-04-06 12:58:37 +0000 |
1876 | @@ -36,35 +36,58 @@ |
1877 | property int minWidth: 0 |
1878 | property int minHeight: 0 |
1879 | |
1880 | + property bool readyToAssesBounds: false |
1881 | + onReadyToAssesBoundsChanged: d.reassesBounds() |
1882 | + |
1883 | QtObject { |
1884 | id: d |
1885 | |
1886 | readonly property int maxSafeInt: 2147483647 |
1887 | readonly property int maxSizeIncrement: units.gu(40) |
1888 | |
1889 | + function reassesBounds() { |
1890 | + if (!readyToAssesBounds) return; |
1891 | + |
1892 | + if (target.windowedWidth < minimumWidth) { |
1893 | + target.windowedWidth = minimumWidth; |
1894 | + } |
1895 | + if (target.windowedHeight < minimumHeight) { |
1896 | + target.windowedHeight = minimumHeight; |
1897 | + } |
1898 | + if (target.windowedHeight < minimumHeight) { |
1899 | + target.windowedHeight = minimumHeight; |
1900 | + } |
1901 | + if (target.windowedWidth > maximumWidth) { |
1902 | + target.windowedWidth = maximumWidth; |
1903 | + } |
1904 | + if (target.windowedHeight > maximumHeight) { |
1905 | + target.windowedHeight = maximumHeight; |
1906 | + } |
1907 | + } |
1908 | + |
1909 | readonly property int minimumWidth: root.target ? Math.max(root.minWidth, root.target.minimumWidth) : root.minWidth |
1910 | onMinimumWidthChanged: { |
1911 | - if (target.windowedWidth < minimumWidth) { |
1912 | + if (readyToAssesBounds && target.windowedWidth < minimumWidth) { |
1913 | target.windowedWidth = minimumWidth; |
1914 | } |
1915 | } |
1916 | readonly property int minimumHeight: root.target ? Math.max(root.minHeight, root.target.minimumHeight) : root.minHeight |
1917 | onMinimumHeightChanged: { |
1918 | - if (target.windowedHeight < minimumHeight) { |
1919 | + if (readyToAssesBounds && target.windowedHeight < minimumHeight) { |
1920 | target.windowedHeight = minimumHeight; |
1921 | } |
1922 | } |
1923 | readonly property int maximumWidth: root.target && root.target.maximumWidth >= minimumWidth && root.target.maximumWidth > 0 |
1924 | ? root.target.maximumWidth : maxSafeInt |
1925 | onMaximumWidthChanged: { |
1926 | - if (target.windowedWidth > maximumWidth) { |
1927 | + if (readyToAssesBounds && target.windowedWidth > maximumWidth) { |
1928 | target.windowedWidth = maximumWidth; |
1929 | } |
1930 | } |
1931 | readonly property int maximumHeight: root.target && root.target.maximumHeight >= minimumHeight && root.target.maximumHeight > 0 |
1932 | ? root.target.maximumHeight : maxSafeInt |
1933 | onMaximumHeightChanged: { |
1934 | - if (target.windowedHeight > maximumHeight) { |
1935 | + if (readyToAssesBounds && target.windowedHeight > maximumHeight) { |
1936 | target.windowedHeight = maximumHeight; |
1937 | } |
1938 | } |
1939 | |
1940 | === modified file 'qml/Stage/WindowStateSaver.qml' |
1941 | --- qml/Stage/WindowStateSaver.qml 2017-02-24 12:54:39 +0000 |
1942 | +++ qml/Stage/WindowStateSaver.qml 2017-04-06 12:58:37 +0000 |
1943 | @@ -43,7 +43,10 @@ |
1944 | (target.fullscreen ? 0 : root.leftMargin)); }); |
1945 | target.windowedY = Qt.binding(function() { return Math.max(Math.min(windowGeometry.y, screenHeight - target.windowedHeight), minimumY); }); |
1946 | |
1947 | - target.updateNormalGeometry(); |
1948 | + target.normalWidth = target.windowedWidth; |
1949 | + target.normalHeight = target.windowedHeight; |
1950 | + target.normalX = target.windowedX; |
1951 | + target.normalY = target.windowedY; |
1952 | |
1953 | // initialize the x/y to restore to |
1954 | target.restoredX = target.normalX; |
1955 | |
1956 | === added file 'qml/Stage/WorkspaceSwitcher.qml' |
1957 | --- qml/Stage/WorkspaceSwitcher.qml 1970-01-01 00:00:00 +0000 |
1958 | +++ qml/Stage/WorkspaceSwitcher.qml 2017-04-06 12:58:37 +0000 |
1959 | @@ -0,0 +1,196 @@ |
1960 | +/* |
1961 | + * Copyright (C) 2014-2016 Canonical, Ltd. |
1962 | + * |
1963 | + * This program is free software; you can redistribute it and/or modify |
1964 | + * it under the terms of the GNU General Public License as published by |
1965 | + * the Free Software Foundation; version 3. |
1966 | + * |
1967 | + * This program is distributed in the hope that it will be useful, |
1968 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1969 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1970 | + * GNU General Public License for more details. |
1971 | + * |
1972 | + * You should have received a copy of the GNU General Public License |
1973 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
1974 | + */ |
1975 | + |
1976 | +import QtQuick 2.4 |
1977 | +import Ubuntu.Components 1.3 |
1978 | +import "Spread" |
1979 | +import WindowManager 1.0 |
1980 | +import Unity.Application 0.1 |
1981 | + |
1982 | +Item { |
1983 | + id: root |
1984 | + |
1985 | + opacity: d.shown ? 1 : 0 |
1986 | + visible: opacity > 0 |
1987 | + Behavior on opacity { UbuntuNumberAnimation {} } |
1988 | + |
1989 | + property var screensProxy: Screens.createProxy(); |
1990 | + property string background |
1991 | + |
1992 | + readonly property alias active: d.active |
1993 | + |
1994 | + function showLeft() { |
1995 | + show(); |
1996 | + d.previousWorkspace(); |
1997 | + } |
1998 | + function showRight() { |
1999 | + show(); |
2000 | + d.nextWorkspace(); |
2001 | + } |
2002 | + function showUp() { |
2003 | + show(); |
2004 | + d.previousScreen(); |
2005 | + } |
2006 | + function showDown() { |
2007 | + show(); |
2008 | + d.nextScreen(); |
2009 | + } |
2010 | + |
2011 | + function show() { |
2012 | + hideTimer.stop(); |
2013 | + d.altPressed = true; |
2014 | + d.ctrlPressed = true; |
2015 | + d.active = true; |
2016 | + d.shown = true; |
2017 | + focus = true; |
2018 | + |
2019 | + d.highlightedScreenIndex = screensProxy.activeScreen; |
2020 | + var activeScreen = screensProxy.get(screensProxy.activeScreen); |
2021 | + d.highlightedWorkspaceIndex = activeScreen.workspaces.indexOf(activeScreen.currentWorkspace) |
2022 | + } |
2023 | + |
2024 | + QtObject { |
2025 | + id: d |
2026 | + |
2027 | + property bool active: false |
2028 | + property bool shown: false |
2029 | + property bool altPressed: false |
2030 | + property bool ctrlPressed: false |
2031 | + |
2032 | + property int rowHeight: root.height - units.gu(4) |
2033 | + |
2034 | + property int highlightedScreenIndex: -1 |
2035 | + property int highlightedWorkspaceIndex: -1 |
2036 | + |
2037 | + function previousWorkspace() { |
2038 | + highlightedWorkspaceIndex = Math.max(highlightedWorkspaceIndex - 1, 0); |
2039 | + } |
2040 | + function nextWorkspace() { |
2041 | + var screen = screensProxy.get(highlightedScreenIndex); |
2042 | + highlightedWorkspaceIndex = Math.min(highlightedWorkspaceIndex + 1, screen.workspaces.count - 1); |
2043 | + } |
2044 | + function previousScreen() { |
2045 | + highlightedScreenIndex = Math.max(highlightedScreenIndex - 1, 0); |
2046 | + var screen = screensProxy.get(highlightedScreenIndex); |
2047 | + highlightedWorkspaceIndex = Math.min(highlightedWorkspaceIndex, screen.workspaces.count - 1) |
2048 | + } |
2049 | + function nextScreen() { |
2050 | + highlightedScreenIndex = Math.min(highlightedScreenIndex + 1, screensProxy.count - 1); |
2051 | + var screen = screensProxy.get(highlightedScreenIndex); |
2052 | + highlightedWorkspaceIndex = Math.min(highlightedWorkspaceIndex, screen.workspaces.count - 1) |
2053 | + } |
2054 | + } |
2055 | + |
2056 | + Timer { |
2057 | + id: hideTimer |
2058 | + interval: 300 |
2059 | + onTriggered: d.shown = false; |
2060 | + } |
2061 | + |
2062 | + Keys.onPressed: { |
2063 | + switch (event.key) { |
2064 | + case Qt.Key_Left: |
2065 | + d.previousWorkspace(); |
2066 | + break; |
2067 | + case Qt.Key_Right: |
2068 | + d.nextWorkspace() |
2069 | + break; |
2070 | + case Qt.Key_Up: |
2071 | + d.previousScreen(); |
2072 | + break; |
2073 | + case Qt.Key_Down: |
2074 | + d.nextScreen(); |
2075 | + } |
2076 | + } |
2077 | + Keys.onReleased: { |
2078 | + switch (event.key) { |
2079 | + case Qt.Key_Alt: |
2080 | + d.altPressed = false; |
2081 | + break; |
2082 | + case Qt.Key_Control: |
2083 | + d.ctrlPressed = false; |
2084 | + break; |
2085 | + } |
2086 | + |
2087 | + if (!d.altPressed && !d.ctrlPressed) { |
2088 | + d.active = false; |
2089 | + hideTimer.start(); |
2090 | + focus = false; |
2091 | + screensProxy.get(d.highlightedScreenIndex).workspaces.get(d.highlightedWorkspaceIndex).activate(); |
2092 | + } |
2093 | + } |
2094 | + |
2095 | + UbuntuShape { |
2096 | + backgroundColor: "#F2111111" |
2097 | + clip: true |
2098 | + width: Math.min(parent.width, screensColumn.width + units.gu(4)) |
2099 | + anchors.horizontalCenter: parent.horizontalCenter |
2100 | + height: parent.height |
2101 | + |
2102 | + Column { |
2103 | + id: screensColumn |
2104 | + anchors { |
2105 | + top: parent.top; topMargin: units.gu(2) - d.highlightedScreenIndex * (d.rowHeight + screensColumn.spacing) |
2106 | + left: parent.left; leftMargin: units.gu(2) |
2107 | + } |
2108 | + width: screensRepeater.itemAt(d.highlightedScreenIndex).width |
2109 | + spacing: units.gu(2) |
2110 | + Behavior on anchors.topMargin { UbuntuNumberAnimation {} } |
2111 | + Behavior on width { UbuntuNumberAnimation {} } |
2112 | + |
2113 | + Repeater { |
2114 | + id: screensRepeater |
2115 | + model: screensProxy |
2116 | + |
2117 | + delegate: Item { |
2118 | + height: d.rowHeight |
2119 | + width: workspaces.width |
2120 | + anchors.horizontalCenter: parent.horizontalCenter |
2121 | + opacity: d.highlightedScreenIndex == index ? 1 : 0 |
2122 | + Behavior on opacity { UbuntuNumberAnimation {} } |
2123 | + |
2124 | + UbuntuShape { |
2125 | + id: header |
2126 | + anchors { left: parent.left; top: parent.top; right: parent.right } |
2127 | + height: units.gu(4) |
2128 | + backgroundColor: "white" |
2129 | + |
2130 | + Label { |
2131 | + anchors { left: parent.left; top: parent.top; right: parent.right; margins: units.gu(1) } |
2132 | + text: model.screen.name |
2133 | + color: UbuntuColors.ash |
2134 | + } |
2135 | + } |
2136 | + |
2137 | + Workspaces { |
2138 | + id: workspaces |
2139 | + height: parent.height - header.height - units.gu(2) |
2140 | + width: Math.min(implicitWidth, root.width - units.gu(4)) |
2141 | + |
2142 | + anchors.bottom: parent.bottom |
2143 | + anchors.bottomMargin: units.gu(1) |
2144 | + anchors.horizontalCenter: parent.horizontalCenter |
2145 | + screen: model.screen |
2146 | + background: root.background |
2147 | + selectedIndex: d.highlightedScreenIndex == index ? d.highlightedWorkspaceIndex : -1 |
2148 | + |
2149 | + workspaceModel: model.screen.workspaces |
2150 | + } |
2151 | + } |
2152 | + } |
2153 | + } |
2154 | + } |
2155 | +} |
2156 | |
2157 | === added file 'qml/Stage/graphics/multi-monitor_drop-here.png' |
2158 | Binary files qml/Stage/graphics/multi-monitor_drop-here.png 1970-01-01 00:00:00 +0000 and qml/Stage/graphics/multi-monitor_drop-here.png 2017-04-06 12:58:37 +0000 differ |
2159 | === added file 'qml/Stage/graphics/multi-monitor_leave.png' |
2160 | Binary files qml/Stage/graphics/multi-monitor_leave.png 1970-01-01 00:00:00 +0000 and qml/Stage/graphics/multi-monitor_leave.png 2017-04-06 12:58:37 +0000 differ |
2161 | === modified file 'tests/mocks/Unity/Application/MirSurfaceItem.cpp' |
2162 | --- tests/mocks/Unity/Application/MirSurfaceItem.cpp 2017-01-26 11:10:01 +0000 |
2163 | +++ tests/mocks/Unity/Application/MirSurfaceItem.cpp 2017-04-06 12:58:37 +0000 |
2164 | @@ -189,11 +189,13 @@ |
2165 | m_qmlItem = qobject_cast<QQuickItem*>(m_qmlContentComponent->create()); |
2166 | m_qmlItem->setParentItem(this); |
2167 | |
2168 | - m_qmlItem->setWidth(m_surfaceWidth); |
2169 | - m_qmlItem->setHeight(m_surfaceHeight); |
2170 | - |
2171 | - setImplicitWidth(m_qmlItem->implicitWidth()); |
2172 | - setImplicitHeight(m_qmlItem->implicitHeight()); |
2173 | + if (m_fillMode == FillMode::Stretch && width() != 0 && height() != 0) { |
2174 | + m_qmlItem->setSize(QSize(this->width(), this->height())); |
2175 | + } else { |
2176 | + m_qmlItem->setSize(m_qmlSurface->size()); |
2177 | + } |
2178 | + setImplicitWidth(m_qmlItem->width()); |
2179 | + setImplicitHeight(m_qmlItem->height()); |
2180 | |
2181 | { |
2182 | QQmlProperty screenshotSource(m_qmlItem, "screenshotSource"); |
2183 | @@ -308,6 +310,16 @@ |
2184 | connect(m_qmlSurface, &MirSurface::screenshotUrlChanged, this, &MirSurfaceItem::updateScreenshot); |
2185 | connect(m_qmlSurface, &MirSurface::liveChanged, this, &MirSurfaceItem::liveChanged); |
2186 | connect(m_qmlSurface, &MirSurface::stateChanged, this, &MirSurfaceItem::surfaceStateChanged); |
2187 | + connect(m_qmlSurface, &MirSurface::sizeChanged, this, [this] () { |
2188 | + setImplicitSize(m_qmlSurface->width(), m_qmlSurface->height()); |
2189 | + if (m_fillMode == FillMode::Stretch) { |
2190 | + m_qmlItem->setSize(QSize(this->width(), this->height())); |
2191 | + } else { |
2192 | + m_qmlItem->setSize(m_qmlSurface->size()); |
2193 | + } |
2194 | + }); |
2195 | + m_surfaceWidth = surface->size().width(); |
2196 | + m_surfaceHeight = surface->size().height(); |
2197 | |
2198 | QUrl qmlComponentFilePath; |
2199 | if (!m_qmlSurface->qmlFilePath().isEmpty()) { |
2200 | @@ -321,6 +333,7 @@ |
2201 | switch (m_qmlContentComponent->status()) { |
2202 | case QQmlComponent::Ready: |
2203 | createQmlContentItem(); |
2204 | + qDebug() << "content created" << m_surfaceWidth << implicitWidth() << width(); |
2205 | break; |
2206 | case QQmlComponent::Loading: |
2207 | connect(m_qmlContentComponent, &QQmlComponent::statusChanged, |
2208 | @@ -399,9 +412,15 @@ |
2209 | if (m_qmlSurface && m_surfaceWidth > 0 && m_surfaceHeight > 0) { |
2210 | m_qmlSurface->resize(m_surfaceWidth, m_surfaceHeight); |
2211 | if (m_qmlItem) { |
2212 | - m_qmlItem->setWidth(m_surfaceWidth); |
2213 | - m_qmlItem->setHeight(m_surfaceHeight); |
2214 | + if (m_fillMode == FillMode::Stretch) { |
2215 | + m_qmlItem->setWidth(width()); |
2216 | + m_qmlItem->setHeight(height()); |
2217 | + } else { |
2218 | + m_qmlItem->setWidth(m_surfaceWidth); |
2219 | + m_qmlItem->setHeight(m_surfaceHeight); |
2220 | + } |
2221 | } |
2222 | + qDebug() << this << "setting implicitsize" << m_surfaceWidth << m_surfaceHeight; |
2223 | setImplicitSize(m_surfaceWidth, m_surfaceHeight); |
2224 | } |
2225 | } |
2226 | |
2227 | === modified file 'tests/mocks/Unity/Application/resources/MirSurfaceItem.qml' |
2228 | --- tests/mocks/Unity/Application/resources/MirSurfaceItem.qml 2016-07-01 15:32:37 +0000 |
2229 | +++ tests/mocks/Unity/Application/resources/MirSurfaceItem.qml 2017-04-06 12:58:37 +0000 |
2230 | @@ -20,9 +20,6 @@ |
2231 | id: root |
2232 | color: "pink" |
2233 | |
2234 | - implicitWidth: width |
2235 | - implicitHeight: height |
2236 | - |
2237 | property alias screenshotSource: screenshotImage.source |
2238 | property int orientationAngle |
2239 | |
2240 | |
2241 | === modified file 'tests/mocks/WindowManager/MockScreens.cpp' |
2242 | --- tests/mocks/WindowManager/MockScreens.cpp 2017-04-06 12:58:36 +0000 |
2243 | +++ tests/mocks/WindowManager/MockScreens.cpp 2017-04-06 12:58:37 +0000 |
2244 | @@ -31,10 +31,11 @@ |
2245 | class MockScreen : public qtmir::Screen |
2246 | { |
2247 | Q_OBJECT |
2248 | + Q_PROPERTY(QString outputTypeName READ outputTypeName NOTIFY outputTypeNameChanged) |
2249 | public: |
2250 | MockScreen() |
2251 | { |
2252 | - m_sizes.append(new qtmir::ScreenMode(50, QSize(640,480))); |
2253 | + m_sizes.append(new qtmir::ScreenMode(50, QSize(800,568))); |
2254 | m_sizes.append(new qtmir::ScreenMode(60, QSize(1280,1024))); |
2255 | m_sizes.append(new qtmir::ScreenMode(60, QSize(1440,900))); |
2256 | m_sizes.append(new qtmir::ScreenMode(60, QSize(1920,1080))); |
2257 | @@ -51,7 +52,6 @@ |
2258 | |
2259 | if (m_connectedWindow) { |
2260 | disconnect(m_connectedWindow.data()); |
2261 | - m_sizes.takeFirst()->deleteLater(); |
2262 | } |
2263 | |
2264 | m_connectedWindow = w; |
2265 | @@ -77,7 +77,6 @@ |
2266 | }); |
2267 | if (w->isActive()) setActive(true); |
2268 | |
2269 | - m_sizes.push_front(new qtmir::ScreenMode(50, w->size())); |
2270 | Q_EMIT availableModesChanged(); |
2271 | |
2272 | } |
2273 | @@ -90,6 +89,7 @@ |
2274 | QSizeF physicalSize() const override { return m_physicalSize; } |
2275 | qtmir::FormFactor formFactor() const override { return m_formFactor; } |
2276 | qtmir::OutputTypes outputType() const override { return m_outputType; } |
2277 | + QString outputTypeName() const { return QStringLiteral("Internal"); } |
2278 | MirPowerMode powerMode() const override { return m_powerMode; } |
2279 | Qt::ScreenOrientation orientation() const override { return m_orientation; } |
2280 | QPoint position() const override { return m_position; } |
2281 | @@ -137,6 +137,9 @@ |
2282 | return true; |
2283 | } |
2284 | |
2285 | +Q_SIGNALS: |
2286 | + void outputTypeNameChanged(); |
2287 | + |
2288 | public: |
2289 | miral::DisplayId m_id; |
2290 | bool m_active{false}; |
2291 | @@ -168,7 +171,7 @@ |
2292 | screen->m_active = i == 0; |
2293 | screen->m_name = QString("Monitor %1").arg(i); |
2294 | screen->m_position = QPoint(lastPoint.x(), lastPoint.y()); |
2295 | - screen->m_currentModeIndex = 3; |
2296 | + screen->m_currentModeIndex = 0; |
2297 | m_mocks.append(screen); |
2298 | |
2299 | lastPoint.rx() += screen->m_sizes[screen->m_currentModeIndex]->size.width(); |
2300 | |
2301 | === modified file 'tests/qmltests/Stage/tst_ApplicationWindow.qml' |
2302 | --- tests/qmltests/Stage/tst_ApplicationWindow.qml 2017-04-06 12:58:36 +0000 |
2303 | +++ tests/qmltests/Stage/tst_ApplicationWindow.qml 2017-04-06 12:58:37 +0000 |
2304 | @@ -245,13 +245,12 @@ |
2305 | function test_showSplashUntilAppFullyInit_data() { |
2306 | return [ |
2307 | {tag: "state=Running then create surface", swapInitOrder: false}, |
2308 | - |
2309 | {tag: "create surface then state=Running", swapInitOrder: true}, |
2310 | ] |
2311 | } |
2312 | |
2313 | function test_showSplashUntilAppFullyInit() { |
2314 | - verify(stateGroup.state === "splashScreen"); |
2315 | + verify(stateGroup.state === "splash"); |
2316 | |
2317 | if (data.swapInitOrder) { |
2318 | surfaceCheckbox.checked = true; |
2319 | @@ -259,7 +258,7 @@ |
2320 | setApplicationState(appRunning); |
2321 | } |
2322 | |
2323 | - verify(stateGroup.state === "splashScreen"); |
2324 | + verify(stateGroup.state === "splash"); |
2325 | |
2326 | if (data.swapInitOrder) { |
2327 | setApplicationState(appRunning); |
2328 | @@ -284,27 +283,8 @@ |
2329 | waitUntilTransitionsEnd(stateGroup); |
2330 | } |
2331 | |
2332 | - function test_killedAppShowsScreenshot() { |
2333 | - surfaceCheckbox.checked = true; |
2334 | - setApplicationState(appRunning); |
2335 | - tryCompare(stateGroup, "state", "surface"); |
2336 | - |
2337 | - setApplicationState(appSuspended); |
2338 | - |
2339 | - verify(stateGroup.state === "surface"); |
2340 | - verify(fakeApplication.surface !== null); |
2341 | - |
2342 | - // kill it! |
2343 | - surfaceCheckbox.checked = false; |
2344 | - setApplicationState(appStopped); |
2345 | - |
2346 | - tryCompare(stateGroup, "state", "screenshot"); |
2347 | - tryCompare(fakeApplication.surfaceList, "count", 0); |
2348 | - } |
2349 | - |
2350 | function test_restartApp() { |
2351 | - var screenshotImage = findChild(applicationWindow, "screenshotImage"); |
2352 | - |
2353 | + tryCompare(stateGroup, "state", "splash"); |
2354 | surfaceCheckbox.checked = true; |
2355 | setApplicationState(appRunning); |
2356 | tryCompare(stateGroup, "state", "surface"); |
2357 | @@ -316,26 +296,23 @@ |
2358 | surfaceCheckbox.checked = false; |
2359 | setApplicationState(appStopped); |
2360 | |
2361 | - tryCompare(stateGroup, "state", "screenshot"); |
2362 | waitUntilTransitionsEnd(stateGroup); |
2363 | - tryCompare(applicationWindow, "surface", null); |
2364 | + tryCompare(stateGroup, "state", "surface"); |
2365 | |
2366 | // and restart it |
2367 | setApplicationState(appStarting); |
2368 | |
2369 | waitUntilTransitionsEnd(stateGroup); |
2370 | - verify(stateGroup.state === "screenshot"); |
2371 | - verify(applicationWindow.surface === null); |
2372 | + verify(stateGroup.state === "surface"); |
2373 | |
2374 | setApplicationState(appRunning); |
2375 | |
2376 | waitUntilTransitionsEnd(stateGroup); |
2377 | - verify(stateGroup.state === "screenshot"); |
2378 | + verify(stateGroup.state === "surface"); |
2379 | |
2380 | surfaceCheckbox.checked = true; |
2381 | |
2382 | tryCompare(stateGroup, "state", "surface"); |
2383 | - tryCompare(screenshotImage, "status", Image.Null); |
2384 | } |
2385 | |
2386 | function test_appCrashed() { |
2387 | @@ -343,13 +320,15 @@ |
2388 | setApplicationState(appRunning); |
2389 | tryCompare(stateGroup, "state", "surface"); |
2390 | waitUntilTransitionsEnd(stateGroup); |
2391 | + var surface = applicationWindow.surface; |
2392 | |
2393 | // oh, it crashed... |
2394 | surfaceCheckbox.checked = false; |
2395 | setApplicationState(appStopped); |
2396 | |
2397 | - tryCompare(stateGroup, "state", "screenshot"); |
2398 | - tryCompare(applicationWindow, "surface", null); |
2399 | + waitUntilTransitionsEnd(stateGroup); |
2400 | + tryCompare(stateGroup, "state", "surface"); |
2401 | + tryCompare(applicationWindow, "surface", surface); |
2402 | } |
2403 | |
2404 | function test_keepSurfaceWhileInvisible() { |
2405 | @@ -393,17 +372,6 @@ |
2406 | verify(surfaceItem.touchReleaseCount === 1); |
2407 | } |
2408 | |
2409 | - function test_showNothingOnSuddenSurfaceLoss() { |
2410 | - surfaceCheckbox.checked = true; |
2411 | - setApplicationState(appRunning); |
2412 | - tryCompare(stateGroup, "state", "surface"); |
2413 | - waitUntilTransitionsEnd(stateGroup); |
2414 | - |
2415 | - applicationWindow.surface = null; |
2416 | - |
2417 | - tryCompare(stateGroup, "state", "void"); |
2418 | - } |
2419 | - |
2420 | function test_surfaceActiveFocusFollowsAppWindowInterative() { |
2421 | applicationWindow.interactive = false; |
2422 | applicationWindow.interactive = true; |
2423 | |
2424 | === modified file 'tests/qmltests/Stage/tst_DesktopStage.qml' |
2425 | --- tests/qmltests/Stage/tst_DesktopStage.qml 2017-04-06 12:58:36 +0000 |
2426 | +++ tests/qmltests/Stage/tst_DesktopStage.qml 2017-04-06 12:58:37 +0000 |
2427 | @@ -558,8 +558,6 @@ |
2428 | var gmailDelegate = startApplication("gmail-webapp"); |
2429 | verify(gmailDelegate); |
2430 | |
2431 | - wait(2000) |
2432 | - |
2433 | var gmailMaximizeButton = findChild(gmailDelegate, "maximizeWindowButton"); |
2434 | verify(gmailMaximizeButton); |
2435 | mouseClick(gmailMaximizeButton); |
2436 | |
2437 | === modified file 'tests/qmltests/Stage/tst_PhoneStage.qml' |
2438 | --- tests/qmltests/Stage/tst_PhoneStage.qml 2017-04-06 12:58:36 +0000 |
2439 | +++ tests/qmltests/Stage/tst_PhoneStage.qml 2017-04-06 12:58:37 +0000 |
2440 | @@ -304,7 +304,6 @@ |
2441 | |
2442 | performEdgeSwipeToShowAppSpread(); |
2443 | |
2444 | - print("tapping", selectedAppDeleage.appId, selectedAppDeleage.visible) |
2445 | if (selectedAppDeleage.x > stage.width - units.gu(5)) { |
2446 | touchFlick(stage, stage.width - units.gu(2), stage.height / 2, units.gu(2), stage.height / 2, true, true, units.gu(2), 10) |
2447 | } |
2448 | |
2449 | === modified file 'tests/qmltests/Stage/tst_TabletStage.qml' |
2450 | --- tests/qmltests/Stage/tst_TabletStage.qml 2017-04-06 12:58:36 +0000 |
2451 | +++ tests/qmltests/Stage/tst_TabletStage.qml 2017-04-06 12:58:37 +0000 |
2452 | @@ -66,7 +66,6 @@ |
2453 | } |
2454 | |
2455 | Component.onCompleted: { |
2456 | - print("starting dash") |
2457 | ApplicationManager.startApplication("unity8-dash"); |
2458 | } |
2459 | } |
2460 | @@ -138,7 +137,6 @@ |
2461 | name: "TabletStage" |
2462 | when: windowShown |
2463 | |
2464 | - readonly property alias topLevelSurfaceList: root.topLevelSurfaceList |
2465 | property Item sideStage: stage ? findChild(stage, "sideStage") : null |
2466 | |
2467 | function init() { |
2468 | @@ -167,6 +165,7 @@ |
2469 | waitUntilAppSurfaceShowsUp(topLevelSurfaceList.idAt(0)); |
2470 | sideStage.hideNow() |
2471 | tryCompare(sideStage, "x", stage.width) |
2472 | + |
2473 | } |
2474 | |
2475 | function cleanup() { |
2476 | @@ -228,7 +227,7 @@ |
2477 | tryCompare(stage, "state", "spread"); |
2478 | } |
2479 | |
2480 | - function swipeSurfaceUpwards(surfaceId) { |
2481 | + function swipeSurfaceDownwards(surfaceId) { |
2482 | var appWindow = findAppWindowForSurfaceId(surfaceId); |
2483 | verify(appWindow); |
2484 | |
2485 | @@ -236,7 +235,7 @@ |
2486 | // to not be covered by other surfaces when they're all being shown in the spread |
2487 | touchFlick(appWindow, |
2488 | appWindow.width * 0.1, appWindow.height / 2, |
2489 | - appWindow.width * 0.1, -appWindow.height / 2); |
2490 | + appWindow.width * 0.1, appWindow.height * 1.5); |
2491 | } |
2492 | |
2493 | function dragToSideStage(surfaceId) { |
2494 | @@ -334,7 +333,7 @@ |
2495 | compare(appDelegate.stage, ApplicationInfoInterface.SideStage); |
2496 | tryCompare(dragArea, "closeable", true); |
2497 | |
2498 | - swipeSurfaceUpwards(dialerSurfaceId); |
2499 | + swipeSurfaceDownwards(dialerSurfaceId); |
2500 | |
2501 | // Check that dialer-app has been closed |
2502 | |
2503 | @@ -345,6 +344,8 @@ |
2504 | tryCompareFunction(function() { |
2505 | return ApplicationManager.findApplication(dialerCheckBox.appId); |
2506 | }, null); |
2507 | + |
2508 | + stage.closeSpread(); |
2509 | } |
2510 | |
2511 | function test_suspendsAndResumesAppsInMainStage() { |
2512 | @@ -597,7 +598,6 @@ |
2513 | |
2514 | function test_loadSideStageByDraggingFromMainStage() { |
2515 | sideStage.showNow(); |
2516 | - print("sidestage now shown. launching browser") |
2517 | var webbrowserSurfaceId = topLevelSurfaceList.nextId; |
2518 | webbrowserCheckBox.checked = true; |
2519 | waitUntilAppSurfaceShowsUp(webbrowserSurfaceId); |
2520 | @@ -662,10 +662,6 @@ |
2521 | // simulate the suspended app being killed by the out-of-memory daemon |
2522 | webbrowserApp.surfaceList.get(0).setLive(false); |
2523 | |
2524 | - // wait until the surface is gone |
2525 | - tryCompare(webbrowserApp.surfaceList, "count", 0); |
2526 | - compare(topLevelSurfaceList.surfaceAt(topLevelSurfaceList.indexForId(webbrowserSurfaceId)), null); |
2527 | - |
2528 | switchToSurface(webbrowserSurfaceId); |
2529 | |
2530 | // webbrowser should have been brought to front |
2531 | |
2532 | === modified file 'tests/qmltests/tst_OrientedShell.qml' |
2533 | --- tests/qmltests/tst_OrientedShell.qml 2017-04-06 12:58:36 +0000 |
2534 | +++ tests/qmltests/tst_OrientedShell.qml 2017-04-06 12:58:37 +0000 |
2535 | @@ -1521,7 +1521,6 @@ |
2536 | } |
2537 | var point = surfaceItem.mapToItem(orientedShell, 0, 0); |
2538 | |
2539 | - print("exptectedAngle", expectedAngle, point.x, point.y) |
2540 | switch (expectedAngle) { |
2541 | case 0: |
2542 | return point.x === 0 && point.y === panelState.panelHeight; |
2543 | |
2544 | === modified file 'tests/qmltests/tst_Shell.qml' |
2545 | --- tests/qmltests/tst_Shell.qml 2017-04-06 12:58:36 +0000 |
2546 | +++ tests/qmltests/tst_Shell.qml 2017-04-06 12:58:37 +0000 |
2547 | @@ -265,6 +265,7 @@ |
2548 | anchors { left: parent.left; right: parent.right } |
2549 | activeFocusOnPress: false |
2550 | model: ["phone", "tablet", "desktop"] |
2551 | + selectedIndex: 2 |
2552 | onSelectedIndexChanged: { |
2553 | shellLoader.state = model[selectedIndex]; |
2554 | } |
2555 | @@ -278,6 +279,7 @@ |
2556 | anchors { left: parent.left; right: parent.right } |
2557 | activeFocusOnPress: false |
2558 | model: ["phone", "tablet", "desktop"] |
2559 | + selectedIndex: 0 |
2560 | } |
2561 | MouseTouchEmulationCheckbox { |
2562 | id: mouseEmulation |
2563 | @@ -1710,9 +1712,9 @@ |
2564 | var spreadDelegate2 = appRepeater.itemAt(2); |
2565 | var closeMouseArea = findChild(spreadDelegate2, "closeMouseArea"); |
2566 | |
2567 | - // Move the mosue over tile 2 and verify the close button becomes visible |
2568 | + // Move the mouse over tile 2 and verify the close button becomes visible |
2569 | var x = 0; |
2570 | - var y = shell.height * .5; |
2571 | + var y = shell.height * .6; |
2572 | mouseMove(shell, x, y) |
2573 | while (spreadItem.highlightedIndex !== 2 && x <= 4000) { |
2574 | x+=10; |
2575 | @@ -1720,6 +1722,7 @@ |
2576 | wait(0); // spin the loop so bindings get evaluated |
2577 | } |
2578 | tryCompare(closeMouseArea, "enabled", true) |
2579 | + waitForRendering(shell) |
2580 | |
2581 | var countBeforeClickingCloseButton = topLevelSurfaceList.count; |
2582 | verify(topLevelSurfaceList.indexForId(surfaceId) === 2); |
2583 | @@ -1761,7 +1764,7 @@ |
2584 | |
2585 | // Move the mouse over tile 2 and verify the highlight becomes visible |
2586 | var x = 0; |
2587 | - var y = shell.height * (data.tileInfo ? .9 : 0.5) |
2588 | + var y = shell.height * (data.tileInfo ? .9 : 0.7) |
2589 | mouseMove(shell, x, y) |
2590 | while (spreadItem.highlightedIndex !== 2 && x <= 4000) { |
2591 | x+=10; |
2592 | @@ -1783,6 +1786,15 @@ |
2593 | function test_progressiveAutoScrolling() { |
2594 | loadDesktopShellWithApps() |
2595 | |
2596 | + // load some more apps |
2597 | + ApplicationManager.startApplication("twitter-webapp") |
2598 | + ApplicationManager.startApplication("ubuntu-weather-app") |
2599 | + ApplicationManager.startApplication("notes-app") |
2600 | + for (var i = 0; i < topLevelSurfaceList.count; ++i) { |
2601 | + waitUntilAppWindowIsFullyLoaded(topLevelSurfaceList.idAt(i)); |
2602 | + } |
2603 | + |
2604 | + |
2605 | var appRepeater = findInvisibleChild(shell, "appRepeater"); |
2606 | verify(appRepeater !== null); |
2607 | |
2608 | @@ -1795,7 +1807,7 @@ |
2609 | |
2610 | // Move the mouse to the right and make sure it scrolls the Flickable |
2611 | var x = 0; |
2612 | - var y = shell.height * .5 |
2613 | + var y = shell.height * .7 |
2614 | mouseMove(shell, x, y) |
2615 | while (x <= shell.width) { |
2616 | x+=10; |
2617 | @@ -2696,7 +2708,6 @@ |
2618 | dashAppDelegate.windowedY = data.windowY; |
2619 | topLevelSurfaceList.inputMethodSurface.setInputBounds(Qt.rect(0, 0, 0, 0)); |
2620 | var initialY = dashAppDelegate.y; |
2621 | - print("intial", initialY, "panel", panelState.panelHeight); |
2622 | verify(initialY > panelState.panelHeight); |
2623 | |
2624 | topLevelSurfaceList.inputMethodSurface.setInputBounds(Qt.rect(0, root.height / 2, root.width, root.height / 2)); |
FAILED: Continuous integration, rev:2762 /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/2901/ /unity8- jenkins. ubuntu. com/job/ build/3785/ console /unity8- jenkins. ubuntu. com/job/ build-0- fetch/3813/ console
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild: /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/2901/ rebuild
https:/