compute availableScreenRect only once

--this commit reduces into half the calculations
needed from the vertical docks in order to position
themselves based on horizontal docks. More specific
it makes the QRegion calculations only once for
each dock instead of two times
v0.6
Michail Vourlakos 8 years ago
parent 2de56fc76c
commit 7a58b80820

@ -441,19 +441,15 @@ QRect DockView::maximumNormalGeometry()
return maxGeometry; return maxGeometry;
} }
void DockView::resizeWindow() void DockView::resizeWindow(QRect availableScreenRect)
{ {
if (formFactor() == Plasma::Types::Vertical) { if (formFactor() == Plasma::Types::Vertical) {
QRegion freeRegion = corona()->availableScreenRegion(this->containment()->screen());
QRect maximumRect = maximumNormalGeometry();
QRect availableRect = freeRegion.intersected(maximumRect).boundingRect();
//qDebug() << "MAXIMUM RECT :: " << maximumRect << " - AVAILABLE RECT :: " << availableRect; //qDebug() << "MAXIMUM RECT :: " << maximumRect << " - AVAILABLE RECT :: " << availableRect;
QSize size{maxThickness(), availableRect.height()}; QSize size{maxThickness(), availableScreenRect.height()};
if (m_drawShadows) { if (m_drawShadows) {
size.setWidth(normalThickness()); size.setWidth(normalThickness());
size.setHeight(static_cast<int>(maxLength() * availableRect.height())); size.setHeight(static_cast<int>(maxLength() * availableScreenRect.height()));
} }
setMinimumSize(size); setMinimumSize(size);
@ -495,13 +491,10 @@ void DockView::updateAbsDockGeometry(const QRect &localDockGeometry)
emit absGeometryChanged(m_absGeometry); emit absGeometryChanged(m_absGeometry);
} }
void DockView::updatePosition() void DockView::updatePosition(QRect availableScreenRect)
{ {
QRect screenGeometry; QRect screenGeometry;
QPoint position; QPoint position;
QRegion freeRegion;
QRect maximumRect;
QRect availableRect;
position = {0, 0}; position = {0, 0};
@ -537,31 +530,21 @@ void DockView::updatePosition()
break; break;
case Plasma::Types::RightEdge: case Plasma::Types::RightEdge:
//screenGeometry = corona()->availableScreenRect(this->containment()->screen());
freeRegion = corona()->availableScreenRegion(this->containment()->screen());
maximumRect = maximumNormalGeometry();
availableRect = freeRegion.intersected(maximumRect).boundingRect();
if (m_drawShadows && !mask().isNull()) { if (m_drawShadows && !mask().isNull()) {
position = {availableRect.right() - cleanThickness + 1, position = {availableScreenRect.right() - cleanThickness + 1,
availableRect.y() + length(availableRect.height()) availableScreenRect.y() + length(availableScreenRect.height())
}; };
} else { } else {
position = {availableRect.right() - width() + 1, availableRect.y()}; position = {availableScreenRect.right() - width() + 1, availableScreenRect.y()};
} }
break; break;
case Plasma::Types::LeftEdge: case Plasma::Types::LeftEdge:
//screenGeometry = corona()->availableScreenRect(this->containment()->screen());
freeRegion = corona()->availableScreenRegion(this->containment()->screen());
maximumRect = maximumNormalGeometry();
availableRect = freeRegion.intersected(maximumRect).boundingRect();
if (m_drawShadows && !mask().isNull()) { if (m_drawShadows && !mask().isNull()) {
position = {availableRect.x(), availableRect.y() + length(availableRect.height())}; position = {availableScreenRect.x(), availableScreenRect.y() + length(availableScreenRect.height())};
} else { } else {
position = {availableRect.x(), availableRect.y()}; position = {availableScreenRect.x(), availableScreenRect.y()};
} }
break; break;
@ -593,9 +576,22 @@ inline void DockView::syncGeometry()
//! if the dock isnt at the correct screen the calculations //! if the dock isnt at the correct screen the calculations
//! are not executed //! are not executed
if (found) { if (found) {
//! compute the free screen rectangle for vertical panels only once
//! this way the costly QRegion computations are calculated only once
//! instead of two times (both inside the resizeWindow and the updatePosition)
QRegion freeRegion;;
QRect maximumRect;
QRect availableScreenRect;
if (formFactor() == Plasma::Types::Vertical) {
freeRegion = corona()->availableScreenRegion(this->containment()->screen());
maximumRect = maximumNormalGeometry();
availableScreenRect = freeRegion.intersected(maximumRect).boundingRect();
}
updateEnabledBorders(); updateEnabledBorders();
resizeWindow(); resizeWindow(availableScreenRect);
updatePosition(); updatePosition(availableScreenRect);
} }
// qDebug() << "dock geometry:" << qRectToStr(geometry()); // qDebug() << "dock geometry:" << qRectToStr(geometry());

@ -76,7 +76,7 @@ public:
void setScreenToFollow(QScreen *screen, bool updateScreenId = true); void setScreenToFollow(QScreen *screen, bool updateScreenId = true);
void resizeWindow(); void resizeWindow(QRect availableScreenRect = QRect());
void syncGeometry(); void syncGeometry();
bool onPrimary() const; bool onPrimary() const;
@ -182,7 +182,7 @@ private slots:
private: private:
void addAppletActions(QMenu *desktopMenu, Plasma::Applet *applet, QEvent *event); void addAppletActions(QMenu *desktopMenu, Plasma::Applet *applet, QEvent *event);
void addContainmentActions(QMenu *desktopMenu, QEvent *event); void addContainmentActions(QMenu *desktopMenu, QEvent *event);
void updatePosition(); void updatePosition(QRect availableScreenRect = QRect());
void updateFormFactor(); void updateFormFactor();
QRect maximumNormalGeometry(); QRect maximumNormalGeometry();

Loading…
Cancel
Save