@@ -48,6 +48,9 @@ FocusScope {
4848 property rect inputMethodRect
4949 property real rightEdgePushProgress: 0
5050 property Item availableDesktopArea
51+ property PanelState panelState
52+
53+ readonly property var temporarySelectedWorkspace: state == "spread" ? screensAndWorkspaces.activeWorkspace : null
5154
5255 // Configuration
5356 property string mode: "staged"
@@ -137,6 +140,7 @@ FocusScope {
137140 function updateFocusedAppOrientationAnimated() { /* TODO */}
138141
139142 function closeSpread() {
143+ spreadItem.highlightedIndex = -1;
140144 priv.goneToSpread = false;
141145 }
142146
@@ -243,6 +247,25 @@ FocusScope {
243247 }
244248 }
245249
250+ GlobalShortcut {
251+ id: showWorkspaceSwitcherShortcutLeft
252+ shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Left
253+ active: !workspaceSwitcher.active
254+ onTriggered: {
255+ root.focus = true;
256+ workspaceSwitcher.showLeft()
257+ }
258+ }
259+ GlobalShortcut {
260+ id: showWorkspaceSwitcherShortcutRight
261+ shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Right
262+ active: !workspaceSwitcher.active
263+ onTriggered: {
264+ root.focus = true;
265+ workspaceSwitcher.showRight()
266+ }
267+ }
268+
246269 QtObject {
247270 id: priv
248271 objectName: "DesktopStagePrivate"
@@ -378,23 +401,23 @@ FocusScope {
378401 readonly property real windowDecorationHeight: units.gu(3)
379402 }
380403
381− Component.onCompleted: priv.updateMainAndSideStageIndexes();
404+ Component.onCompleted: priv.updateMainAndSideStageIndexes()
382405
383406 Connections {
384− target: PanelState
407+ target: panelState
385408 onCloseClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
386409 onMinimizeClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.requestMinimize(); } }
387410 onRestoreClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.requestRestore(); } }
388411 }
389412
390413 Binding {
391− target: PanelState
414+ target: panelState
392415 property: "decorationsVisible"
393416 value: priv.focusedAppDelegate !== null && priv.focusedAppDelegate.maximized // FIXME for Locally integrated menus
394417 }
395418
396419 Binding {
397− target: PanelState
420+ target: panelState
398421 property: "title"
399422 value: {
400423 if (priv.focusedAppDelegate !== null) {
@@ -409,7 +432,7 @@ FocusScope {
409432 }
410433
411434 Binding {
412− target: PanelState
435+ target: panelState
413436 property: "focusedPersistentSurfaceId"
414437 value: {
415438 if (priv.focusedAppDelegate !== null) {
@@ -423,21 +446,21 @@ FocusScope {
423446 }
424447
425448 Binding {
426− target: PanelState
449+ target: panelState
427450 property: "dropShadow"
428451 value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppDelegate !== null && mode == "windowed"
429452 }
430453
431454 Binding {
432− target: PanelState
455+ target: panelState
433456 property: "closeButtonShown"
434457 value: priv.focusedAppDelegate && priv.focusedAppDelegate.maximized && !priv.focusedAppDelegate.isDash
435458 }
436459
437460 Component.onDestruction: {
438− PanelState.title = "";
439− PanelState.decorationsVisible = false;
440− PanelState.dropShadow = false;
461+ panelState.title = "";
462+ panelState.decorationsVisible = false;
463+ panelState.dropShadow = false;
441464 }
442465
443466 Instantiator {
@@ -483,6 +506,7 @@ FocusScope {
483506 PropertyChanges { target: cancelSpreadMouseArea; enabled: true }
484507 PropertyChanges { target: blurLayer; visible: true; blurRadius: 32; brightness: .65; opacity: 1 }
485508 PropertyChanges { target: wallpaper; visible: false }
509+ PropertyChanges { target: screensAndWorkspaces; opacity: 1 }
486510 },
487511 State {
488512 name: "stagedRightEdge"; when: root.spreadEnabled && (rightEdgeDragArea.dragging || rightEdgePushProgress > 0) && root.mode == "staged"
@@ -530,11 +554,18 @@ FocusScope {
530554 Transition {
531555 from: "stagedRightEdge,sideStagedRightEdge,windowedRightEdge"; to: "spread"
532556 PropertyAction { target: spreadItem; property: "highlightedIndex"; value: -1 }
557+ PropertyAction { target: screensAndWorkspaces; property: "activeWorkspace"; value: WMScreen.currentWorkspace }
558+ ScriptAction { script: { print("blabal***********************", WMScreen.currentWorkspace) } }
533559 PropertyAnimation { target: blurLayer; properties: "brightness,blurRadius"; duration: priv.animationDuration }
560+ UbuntuNumberAnimation { target: screensAndWorkspaces; property: "opacity"; duration: priv.animationDuration }
534561 },
535562 Transition {
536563 to: "spread"
564+ PropertyAction { target: screensAndWorkspaces; property: "activeWorkspace"; value: WMScreen.currentWorkspace }
565+ ScriptAction { script: { print("blabal***********************", WMScreen.currentWorkspace) } }
537566 PropertyAction { target: spreadItem; property: "highlightedIndex"; value: appRepeater.count > 1 ? 1 : 0 }
567+ PropertyAction { target: floatingFlickable; property: "contentX"; value: 0 }
568+ UbuntuNumberAnimation { target: screensAndWorkspaces; property: "opacity"; duration: priv.animationDuration }
538569 },
539570 Transition {
540571 from: "spread"
@@ -592,10 +623,20 @@ FocusScope {
592623 visible: false
593624 }
594625
626+ ScreensAndWorkspaces {
627+ id: screensAndWorkspaces
628+ anchors { left: parent.left; top: parent.top; right: parent.right; leftMargin: root.leftMargin }
629+ height: Math.max(units.gu(30), parent.height * .3)
630+ background: root.background
631+ opacity: 0
632+ visible: opacity > 0
633+ onCloseSpread: priv.goneToSpread = false;
634+ }
635+
595636 Spread {
596637 id: spreadItem
597638 objectName: "spreadItem"
598− anchors.fill: appContainer
639+ anchors { left: parent.left; bottom: parent.bottom; right: parent.right; top: screensAndWorkspaces.bottom }
599640 leftMargin: root.availableDesktopArea.x
600641 model: root.topLevelSurfaceList
601642 spreadFlickable: floatingFlickable
@@ -610,6 +651,83 @@ FocusScope {
610651 appRepeater.itemAt(highlightedIndex).close();
611652 }
612653 }
654+
655+ FloatingFlickable {
656+ id: floatingFlickable
657+ objectName: "spreadFlickable"
658+ anchors.fill: parent
659+ enabled: false
660+ contentWidth: spreadItem.spreadTotalWidth
661+
662+ function snap(toIndex) {
663+ var delegate = appRepeater.itemAt(toIndex)
664+ var targetContentX = floatingFlickable.contentWidth / spreadItem.totalItemCount * toIndex;
665+ if (targetContentX - floatingFlickable.contentX > spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) {
666+ var offset = (spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) - (targetContentX - floatingFlickable.contentX)
667+ snapAnimation.to = floatingFlickable.contentX - offset;
668+ snapAnimation.start();
669+ } else if (targetContentX - floatingFlickable.contentX < spreadItem.leftStackXPos + units.gu(1)) {
670+ var offset = (spreadItem.leftStackXPos + units.gu(1)) - (targetContentX - floatingFlickable.contentX);
671+ snapAnimation.to = floatingFlickable.contentX - offset;
672+ snapAnimation.start();
673+ }
674+ }
675+ UbuntuNumberAnimation {id: snapAnimation; target: floatingFlickable; property: "contentX"}
676+ }
677+
678+ MouseArea {
679+ id: hoverMouseArea
680+ objectName: "hoverMouseArea"
681+ anchors.fill: parent
682+ propagateComposedEvents: true
683+ hoverEnabled: true
684+ enabled: false
685+ visible: enabled
686+
687+ property int scrollAreaWidth: width / 3
688+ property bool progressiveScrollingEnabled: false
689+
690+ onPressed: mouse.accepted = false
691+
692+ onMouseXChanged: {
693+ mouse.accepted = false
694+
695+ if (hoverMouseArea.pressed) {
696+ return;
697+ }
698+
699+ // Find the hovered item and mark it active
700+ for (var i = appRepeater.count - 1; i >= 0; i--) {
701+ var appDelegate = appRepeater.itemAt(i);
702+ var mapped = mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
703+ var itemUnder = appDelegate.childAt(mapped.x, mapped.y);
704+ if (itemUnder && (itemUnder.objectName === "dragArea" || itemUnder.objectName === "windowInfoItem" || itemUnder.objectName == "closeMouseArea")) {
705+ spreadItem.highlightedIndex = i;
706+ break;
707+ }
708+ }
709+
710+ if (floatingFlickable.contentWidth > floatingFlickable.width) {
711+ var margins = floatingFlickable.width * 0.05;
712+
713+ if (!progressiveScrollingEnabled && mouseX < floatingFlickable.width - scrollAreaWidth) {
714+ progressiveScrollingEnabled = true
715+ }
716+
717+ // do we need to scroll?
718+ if (mouseX < scrollAreaWidth + margins) {
719+ var progress = Math.min(1, (scrollAreaWidth + margins - mouseX) / (scrollAreaWidth - margins));
720+ var contentX = (1 - progress) * (floatingFlickable.contentWidth - floatingFlickable.width)
721+ floatingFlickable.contentX = Math.max(0, Math.min(floatingFlickable.contentX, contentX))
722+ }
723+ if (mouseX > floatingFlickable.width - scrollAreaWidth && progressiveScrollingEnabled) {
724+ var progress = Math.min(1, (mouseX - (floatingFlickable.width - scrollAreaWidth)) / (scrollAreaWidth - margins))
725+ var contentX = progress * (floatingFlickable.contentWidth - floatingFlickable.width)
726+ floatingFlickable.contentX = Math.min(floatingFlickable.contentWidth - floatingFlickable.width, Math.max(floatingFlickable.contentX, contentX))
727+ }
728+ }
729+ }
730+ }
613731 }
614732
615733 Connections {
@@ -704,6 +822,24 @@ FocusScope {
704822 }
705823 }
706824
825+ MirSurfaceItem {
826+ id: fakeDragItem
827+ property real previewScale: .5
828+ height: (screensAndWorkspaces.height - units.gu(8)) / 2
829+ // w : h = iw : ih
830+ width: implicitWidth * height / implicitHeight
831+ surfaceWidth: -1
832+ surfaceHeight: -1
833+ opacity: surface != null ? 1 : 0
834+ Behavior on opacity { UbuntuNumberAnimation {} }
835+ visible: opacity > 0
836+
837+ Drag.active: surface != null
838+ Drag.keys: ["application"]
839+
840+ z: 1000
841+ }
842+
707843 Repeater {
708844 id: appRepeater
709845 model: topLevelSurfaceList
@@ -732,6 +868,9 @@ FocusScope {
732868 }
733869 z: normalZ
734870
871+ opacity: fakeDragItem.surface == model.window.surface && fakeDragItem.Drag.active ? 0 : 1
872+ Behavior on opacity { UbuntuNumberAnimation {} }
873+
735874 // Normally we want x/y where the surface thinks it is. Width/height of our delegate will
736875 // match what the actual surface size is.
737876 // Don't write to those, they will be set by states
@@ -912,7 +1051,6 @@ FocusScope {
9121051 function claimFocus() {
9131052 if (root.state == "spread") {
9141053 spreadItem.highlightedIndex = index
915− priv.goneToSpread = false;
9161054 }
9171055 if (root.mode == "stagedWithSideStage") {
9181056 if (appDelegate.stage == ApplicationInfoInterface.SideStage && !sideStage.shown) {
@@ -1246,8 +1384,6 @@ FocusScope {
12461384 y: spreadMaths.targetY
12471385 z: index
12481386 height: spreadItem.spreadItemHeight
1249− requestedWidth: decoratedWindow.oldRequestedWidth
1250− requestedHeight: decoratedWindow.oldRequestedHeight
12511387 visible: spreadMaths.itemVisible
12521388 }
12531389 PropertyChanges { target: dragArea; enabled: true }
@@ -1267,8 +1403,6 @@ FocusScope {
12671403 y: stagedRightEdgeMaths.animatedY
12681404 z: stagedRightEdgeMaths.animatedZ
12691405 height: stagedRightEdgeMaths.animatedHeight
1270− requestedWidth: decoratedWindow.oldRequestedWidth
1271− requestedHeight: decoratedWindow.oldRequestedHeight
12721406 visible: appDelegate.x < root.width
12731407 }
12741408 PropertyChanges {
@@ -1298,8 +1432,6 @@ FocusScope {
12981432 y: windowedRightEdgeMaths.animatedY
12991433 z: windowedRightEdgeMaths.animatedZ
13001434 height: stagedRightEdgeMaths.animatedHeight
1301− requestedWidth: decoratedWindow.oldRequestedWidth
1302− requestedHeight: decoratedWindow.oldRequestedHeight
13031435 }
13041436 PropertyChanges {
13051437 target: decoratedWindow
@@ -1322,11 +1454,15 @@ FocusScope {
13221454 target: appDelegate
13231455 x: stageMaths.itemX
13241456 y: root.availableDesktopArea.y
1325− requestedWidth: appContainer.width
1326− requestedHeight: root.availableDesktopArea.height
13271457 visuallyMaximized: true
13281458 visible: appDelegate.x < root.width
13291459 }
1460+ PropertyChanges {
1461+ target: appDelegate
1462+ requestedWidth: appContainer.width
1463+ requestedHeight: root.availableDesktopArea.height
1464+ restoreEntryValues: false
1465+ }
13301466 PropertyChanges {
13311467 target: decoratedWindow
13321468 hasDecoration: false
@@ -1355,11 +1491,15 @@ FocusScope {
13551491 x: stageMaths.itemX
13561492 y: root.availableDesktopArea.y
13571493 z: stageMaths.itemZ
1358− requestedWidth: stageMaths.itemWidth
1359− requestedHeight: root.availableDesktopArea.height
13601494 visuallyMaximized: true
13611495 visible: appDelegate.x < root.width
13621496 }
1497+ PropertyChanges {
1498+ target: appDelegate
1499+ requestedWidth: stageMaths.itemWidth
1500+ requestedHeight: root.availableDesktopArea.height
1501+ restoreEntryValues: false
1502+ }
13631503 PropertyChanges {
13641504 target: decoratedWindow
13651505 hasDecoration: false
@@ -1381,8 +1521,12 @@ FocusScope {
13811521 requestedY: 0;
13821522 visuallyMinimized: false;
13831523 visuallyMaximized: true
1524+ }
1525+ PropertyChanges {
1526+ target: appDelegate
13841527 requestedWidth: root.availableDesktopArea.width;
13851528 requestedHeight: appContainer.height;
1529+ restoreEntryValues: false
13861530 }
13871531 PropertyChanges { target: touchControls; enabled: true }
13881532 },
@@ -1392,8 +1536,12 @@ FocusScope {
13921536 target: appDelegate;
13931537 requestedX: 0
13941538 requestedY: 0
1395− requestedWidth: appContainer.width;
1396− requestedHeight: appContainer.height;
1539+ }
1540+ PropertyChanges {
1541+ target: appDelegate
1542+ requestedWidth: appContainer.width
1543+ requestedHeight: appContainer.height
1544+ restoreEntryValues: false
13971545 }
13981546 PropertyChanges { target: decoratedWindow; hasDecoration: false }
13991547 },
@@ -1408,6 +1556,12 @@ FocusScope {
14081556 PropertyChanges { target: touchControls; enabled: true }
14091557 PropertyChanges { target: resizeArea; enabled: true }
14101558 PropertyChanges { target: decoratedWindow; shadowOpacity: .3}
1559+ PropertyChanges {
1560+ target: appDelegate
1561+ requestedWidth: windowedWidth
1562+ requestedHeight: windowedHeight
1563+ restoreEntryValues: false
1564+ }
14111565 },
14121566 State {
14131567 name: "restored";
@@ -1508,6 +1662,10 @@ FocusScope {
15081662 }
15091663 }
15101664 ]
1665+ onStateChanged: {
1666+ print("item", index, "state changed", state)
1667+ }
1668+
15111669 transitions: [
15121670 Transition {
15131671 from: "staged,stagedWithSideStage"
@@ -1521,6 +1679,7 @@ FocusScope {
15211679 UbuntuNumberAnimation { target: appDelegate; properties: "x,y,requestedX,requestedY,requestedWidth,requestedHeight"; duration: priv.animationDuration}
15221680 },
15231681 Transition {
1682+ from: "normal,restored,maximized,maximizedHorizontally,maximizedVertically,maximizedLeft,maximizedRight,maximizedTopLeft,maximizedBottomLeft,maximizedTopRight,maximizedBottomRight,staged,stagedWithSideStage,windowedRightEdge,stagedRightEdge";
15241683 to: "spread"
15251684 // DecoratedWindow wants the scaleToPreviewSize set before enabling scaleToPreview
15261685 PropertyAction { target: appDelegate; properties: "z,visible" }
@@ -1606,7 +1765,7 @@ FocusScope {
16061765 ]
16071766
16081767 Binding {
1609− target: PanelState
1768+ target: panelState
16101769 property: "decorationsAlwaysVisible"
16111770 value: appDelegate && appDelegate.maximized && touchControls.overlayShown
16121771 }
@@ -1627,6 +1786,7 @@ FocusScope {
16271786 borderThickness: units.gu(2)
16281787 enabled: false
16291788 visible: enabled
1789+ readyToAssesBounds: !appDelegate._constructing
16301790
16311791 onPressed: {
16321792 appDelegate.activate();
@@ -1650,18 +1810,13 @@ FocusScope {
16501810 width: implicitWidth
16511811 height: implicitHeight
16521812 highlightSize: windowInfoItem.iconMargin / 2
1653− altDragEnabled: root.mode == "windowed"
16541813 boundsItem: root.availableDesktopArea
1814+ panelState: root.panelState
1815+ altDragEnabled: root.mode == "windowed"
16551816
16561817 requestedWidth: appDelegate.requestedWidth
16571818 requestedHeight: appDelegate.requestedHeight
16581819
1659− property int oldRequestedWidth: -1
1660− property int oldRequestedHeight: -1
1661−
1662− onRequestedWidthChanged: oldRequestedWidth = requestedWidth
1663− onRequestedHeightChanged: oldRequestedHeight = requestedHeight
1664−
16651820 onCloseClicked: { appDelegate.close(); }
16661821 onMaximizeClicked: {
16671822 if (appDelegate.canBeMaximized) {
@@ -1742,6 +1897,8 @@ FocusScope {
17421897 anchors.fill: decoratedWindow
17431898 enabled: false
17441899 closeable: !appDelegate.isDash
1900+ stage: root
1901+ dragDelegate: fakeDragItem
17451902
17461903 onClicked: {
17471904 spreadItem.highlightedIndex = index;
@@ -1784,12 +1941,15 @@ FocusScope {
17841941 objectName: "closeMouseArea"
17851942 anchors { left: parent.left; top: parent.top; leftMargin: -height / 2; topMargin: -height / 2 + spreadMaths.closeIconOffset }
17861943 readonly property var mousePos: hoverMouseArea.mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
1787− visible: !appDelegate.isDash && dragArea.distance == 0
1944+ readonly property bool shown: !appDelegate.isDash && dragArea.distance == 0
17881945 && index == spreadItem.highlightedIndex
17891946 && mousePos.y < (decoratedWindow.height / 3)
17901947 && mousePos.y > -units.gu(4)
17911948 && mousePos.x > -units.gu(4)
17921949 && mousePos.x < (decoratedWindow.width * 2 / 3)
1950+ opacity: shown ? 1 : 0
1951+ visible: opacity > 0
1952+ Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
17931953 height: units.gu(6)
17941954 width: height
17951955
@@ -1860,83 +2020,19 @@ FocusScope {
18602020 leftMargin: root.availableDesktopArea.x
18612021 appContainerWidth: appContainer.width
18622022 appContainerHeight: appContainer.height
2023+ panelState: root.panelState
18632024 }
18642025
1865− MouseArea {
1866− id: hoverMouseArea
1867− objectName: "hoverMouseArea"
1868− anchors.fill: appContainer
1869− propagateComposedEvents: true
1870− hoverEnabled: true
1871− enabled: false
1872− visible: enabled
1873−
1874− property int scrollAreaWidth: width / 3
1875− property bool progressiveScrollingEnabled: false
1876−
1877− onMouseXChanged: {
1878− mouse.accepted = false
1879−
1880− if (hoverMouseArea.pressed) {
1881− return;
1882− }
1883−
1884− // Find the hovered item and mark it active
1885− for (var i = appRepeater.count - 1; i >= 0; i--) {
1886− var appDelegate = appRepeater.itemAt(i);
1887− var mapped = mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
1888− var itemUnder = appDelegate.childAt(mapped.x, mapped.y);
1889− if (itemUnder && (itemUnder.objectName === "dragArea" || itemUnder.objectName === "windowInfoItem" || itemUnder.objectName == "closeMouseArea")) {
1890− spreadItem.highlightedIndex = i;
1891− break;
1892− }
1893− }
1894−
1895− if (floatingFlickable.contentWidth > floatingFlickable.width) {
1896− var margins = floatingFlickable.width * 0.05;
1897−
1898− if (!progressiveScrollingEnabled && mouseX < floatingFlickable.width - scrollAreaWidth) {
1899− progressiveScrollingEnabled = true
1900− }
1901−
1902− // do we need to scroll?
1903− if (mouseX < scrollAreaWidth + margins) {
1904− var progress = Math.min(1, (scrollAreaWidth + margins - mouseX) / (scrollAreaWidth - margins));
1905− var contentX = (1 - progress) * (floatingFlickable.contentWidth - floatingFlickable.width)
1906− floatingFlickable.contentX = Math.max(0, Math.min(floatingFlickable.contentX, contentX))
1907− }
1908− if (mouseX > floatingFlickable.width - scrollAreaWidth && progressiveScrollingEnabled) {
1909− var progress = Math.min(1, (mouseX - (floatingFlickable.width - scrollAreaWidth)) / (scrollAreaWidth - margins))
1910− var contentX = progress * (floatingFlickable.contentWidth - floatingFlickable.width)
1911− floatingFlickable.contentX = Math.min(floatingFlickable.contentWidth - floatingFlickable.width, Math.max(floatingFlickable.contentX, contentX))
1912− }
1913− }
1914− }
1915−
1916− onPressed: mouse.accepted = false
1917− }
1918−
1919− FloatingFlickable {
1920− id: floatingFlickable
1921− objectName: "spreadFlickable"
1922− anchors.fill: appContainer
1923− enabled: false
1924− contentWidth: spreadItem.spreadTotalWidth
1925−
1926− function snap(toIndex) {
1927− var delegate = appRepeater.itemAt(toIndex)
1928− var targetContentX = floatingFlickable.contentWidth / spreadItem.totalItemCount * toIndex;
1929− if (targetContentX - floatingFlickable.contentX > spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) {
1930− var offset = (spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) - (targetContentX - floatingFlickable.contentX)
1931− snapAnimation.to = Math.max(0, floatingFlickable.contentX - offset);
1932− snapAnimation.start();
1933− } else if (targetContentX - floatingFlickable.contentX < spreadItem.leftStackXPos + units.gu(1)) {
1934− var offset = (spreadItem.leftStackXPos + units.gu(1)) - (targetContentX - floatingFlickable.contentX);
1935− snapAnimation.to = Math.max(0, floatingFlickable.contentX - offset);
1936− snapAnimation.start();
2026+ WorkspaceSwitcher {
2027+ id: workspaceSwitcher
2028+ anchors.centerIn: parent
2029+ height: units.gu(20)
2030+ background: root.background
2031+ onActiveChanged: {
2032+ if (!active) {
2033+ appContainer.focus = true;
19372034 }
19382035 }
1939− UbuntuNumberAnimation {id: snapAnimation; target: floatingFlickable; property: "contentX"}
19402036 }
19412037
19422038 PropertyAnimation {