SVN commit 1105290 by abizjak: backport revision 1105289 Before adding an item to a requested position. check if it would meet the visibility criterion. If not, use the positioning algorithm instead. BUG: 229616 M +23 -22 desktoplayout.cpp M +1 -0 desktoplayout.h --- branches/KDE/4.4/kdebase/workspace/plasma/desktop/containments/desktop/desktoplayout.cpp #1105289:1105290 @@ -41,6 +41,10 @@ if (position) { logicalGeom = positionNewItem(logicalGeom.size()); + } else { + if (itemSpace.positionVisibility(predictNewItemGeometry(logicalGeom)) < 1.0 - visibilityTolerance) { + logicalGeom = positionNewItem(logicalGeom.size()); + } } ItemSpace::ItemSpaceItem spaceItem; @@ -80,28 +84,7 @@ QPointF bestPosition = QPointF(); qreal bestVisibility = 0; foreach (const QPointF &position, possiblePositions) { - // see how much the item can be pushed into the working area: - // copy our ItemSpace, add the item to the copy - // and check the resulting position's visibility - - ItemSpace tempItemSpace(itemSpace); - - ItemSpace::ItemSpaceItem spaceItem; - spaceItem.pushBack = false; - spaceItem.animateMovement = false; - spaceItem.preferredPosition = position; - spaceItem.lastGeometry = QRectF(position, itemSize); - spaceItem.user = QVariant(-1); - - tempItemSpace.addItem(spaceItem); - int tempGroup, tempItem; - tempItemSpace.locateItemByUser(QVariant(-1), &tempGroup, &tempItem); - - QRectF resultingGeom = tempItemSpace.m_groups[tempGroup].m_groupItems[tempItem].lastGeometry; - qreal visibility = tempItemSpace.positionVisibility(resultingGeom); - - //kDebug() << "Trying " << position << " visibility " << visibility; - + qreal visibility = itemSpace.positionVisibility(predictNewItemGeometry(QRectF(position, itemSize))); if (visibility > bestVisibility) { bestPosition = position; bestVisibility = visibility; @@ -286,6 +269,24 @@ return detransformed; } +QRectF DesktopLayout::predictNewItemGeometry(const QRectF &logicalGeom) +{ + ItemSpace tempItemSpace(itemSpace); + + ItemSpace::ItemSpaceItem spaceItem; + spaceItem.pushBack = false; + spaceItem.animateMovement = false; + spaceItem.preferredPosition = logicalGeom.topLeft(); + spaceItem.lastGeometry = logicalGeom; + spaceItem.user = QVariant(-1); + + tempItemSpace.addItem(spaceItem); + int tempGroup, tempItem; + tempItemSpace.locateItemByUser(QVariant(-1), &tempGroup, &tempItem); + + return tempItemSpace.m_groups[tempGroup].m_groupItems[tempItem].lastGeometry; +} + void DesktopLayout::adjustPhysicalPositions() { for (int groupId = 0; groupId < itemSpace.m_groups.size(); groupId++) { --- branches/KDE/4.4/kdebase/workspace/plasma/desktop/containments/desktop/desktoplayout.h #1105289:1105290 @@ -127,6 +127,7 @@ QRectF transformRect(const QRectF &rect, const QTransform &transform); void getItemInstantRelativeGeometry(QGraphicsWidget *item, QRectF &outGeometry, QTransform &outRevertTransform); QRectF geometryRelativeToAbsolute(int itemKey, const QRectF &relative); + QRectF predictNewItemGeometry(const QRectF &logicalGeom); class DesktopLayoutItem {