Fix layout issues of Desktop Change OSD

* no more binding loops - yeah for anchoring
* properly update sizes when switching screens
* properly handle case layout indicator enabled/disabled
* connect to desktop changed and reset desktop model
* set a maximum width/height of 0.8 of screen

Most interesting change is the moving of
visible = true;
to the beginning of the block which updates the layout. Without that
all the changes are ignored resulting in the incorrect size on screen
change.

The disadvantage of that is that the OSD is shown before the layout is
adjusted. But it's considerable minor given that it should be just one
frame.

BUG: 312728
BUG: 312727
BUG: 305737
FIXED-IN: 4.10.1
REVIEW: 108945
This commit is contained in:
Martin Gräßlin 2013-02-13 16:04:13 +01:00
parent b8dcc04373
commit 34bb1a790f

View file

@ -54,8 +54,8 @@ Item {
mainItem: Item { mainItem: Item {
id: dialogItem id: dialogItem
width: childrenRect.width width: root.showGrid ? view.itemWidth * view.columns : textElement.width
height: childrenRect.height height: root.showGrid ? view.itemHeight * view.rows + textElement.height : textElement.height
Plasma.Label { Plasma.Label {
id: textElement id: textElement
anchors.top: root.showGrid ? parent.top : undefined anchors.top: root.showGrid ? parent.top : undefined
@ -64,11 +64,19 @@ Item {
} }
Grid { Grid {
id: view id: view
property int itemWidth: root.screenWidth * 0.1 columns: 1
property int itemHeight: root.screenHeight * 0.1 rows: 1
anchors.top: textElement.bottom property int itemWidth: root.screenWidth * Math.min(0.8/columns, 0.1)
property int itemHeight: Math.min(itemWidth * (root.screenHeight / root.screenWidth), root.screenHeight * Math.min(0.8/rows, 0.1))
anchors {
top: textElement.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
visible: root.showGrid visible: root.showGrid
Repeater { Repeater {
id: repeater
model: workspace.desktops model: workspace.desktops
Item { Item {
width: view.itemWidth width: view.itemWidth
@ -243,10 +251,6 @@ Item {
Component.onCompleted: { Component.onCompleted: {
columns = workspace.desktopGridWidth; columns = workspace.desktopGridWidth;
rows = workspace.desktopGridHeight; rows = workspace.desktopGridHeight;
if (!root.showGrid) {
width = 0;
height = 0;
}
} }
} }
} }
@ -265,6 +269,7 @@ Item {
if (root.currentDesktop == workspace.currentDesktop - 1) { if (root.currentDesktop == workspace.currentDesktop - 1) {
return; return;
} }
dialog.visible = true;
root.previousDesktop = root.currentDesktop; root.previousDesktop = root.currentDesktop;
timer.stop(); timer.stop();
root.currentDesktop = workspace.currentDesktop - 1; root.currentDesktop = workspace.currentDesktop - 1;
@ -277,20 +282,15 @@ Item {
// non dependable properties might have changed // non dependable properties might have changed
view.columns = workspace.desktopGridWidth; view.columns = workspace.desktopGridWidth;
view.rows = workspace.desktopGridHeight; view.rows = workspace.desktopGridHeight;
view.width = workspace.desktopGridWidth * view.itemWidth;
view.height = workspace.desktopGridHeight * view.itemHeight;
} else {
view.width = 0;
view.height = 0;
dialogItem.width = textElement.width;
dialogItem.height = textElement.height;
} }
// position might have changed // position might have changed
dialog.x = screen.x + screen.width/2 - dialogItem.width/2; dialog.x = screen.x + screen.width/2 - dialogItem.width/2;
dialog.y = screen.y + screen.height/2 - dialogItem.height/2; dialog.y = screen.y + screen.height/2 - dialogItem.height/2;
// start the hide timer // start the hide timer
timer.start(); timer.start();
dialog.visible = true; }
onNumberDesktopsChanged: {
repeater.model = workspace.desktops;
} }
} }
Connections { Connections {