void OSDPretty::paintEvent(QPaintEvent*) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::HighQualityAntialiasing); QRect box(BoxBorder()); // Shadow corners const int kShadowCornerSize = kDropShadowSize + kBorderRadius; p.drawPixmap(0, 0, shadow_corner_[0]); p.drawPixmap(width() - kShadowCornerSize, 0, shadow_corner_[1]); p.drawPixmap(width() - kShadowCornerSize, height() - kShadowCornerSize, shadow_corner_[2]); p.drawPixmap(0, height() - kShadowCornerSize, shadow_corner_[3]); // Shadow edges p.drawTiledPixmap(kShadowCornerSize, 0, width() - kShadowCornerSize * 2, kDropShadowSize, shadow_edge_[0]); p.drawTiledPixmap(width() - kDropShadowSize, kShadowCornerSize, kDropShadowSize, height() - kShadowCornerSize * 2, shadow_edge_[1]); p.drawTiledPixmap(kShadowCornerSize, height() - kDropShadowSize, width() - kShadowCornerSize * 2, kDropShadowSize, shadow_edge_[2]); p.drawTiledPixmap(0, kShadowCornerSize, kDropShadowSize, height() - kShadowCornerSize * 2, shadow_edge_[3]); // Box background p.setBrush(background_color_); p.setPen(QPen()); p.setOpacity(background_opacity_); p.drawRoundedRect(box, kBorderRadius, kBorderRadius); // Background pattern QPainterPath background_path; background_path.addRoundedRect(box, kBorderRadius, kBorderRadius); p.setClipPath(background_path); p.setOpacity(1.0); p.drawPixmap(box.right() - background_.width(), box.bottom() - background_.height(), background_); p.setClipping(false); // Gradient overlay QLinearGradient gradient(0, 0, 0, height()); gradient.setColorAt(0, QColor(255, 255, 255, 130)); gradient.setColorAt(1, QColor(255, 255, 255, 50)); p.setBrush(gradient); p.drawRoundedRect(box, kBorderRadius, kBorderRadius); // Box border p.setBrush(QBrush()); p.setPen(QPen(background_color_.darker(150), 2)); p.drawRoundedRect(box, kBorderRadius, kBorderRadius); }
void OSDPretty::Reposition() { QDesktopWidget* desktop = QApplication::desktop(); // Make the OSD the proper size layout()->activate(); resize(sizeHint()); // Work out where to place the OSD. -1 for x or y means "on the right or // bottom edge". QRect geometry(desktop->availableGeometry(popup_display_)); int x = popup_pos_.x() < 0 ? geometry.right() - width() : geometry.left() + popup_pos_.x(); int y = popup_pos_.y() < 0 ? geometry.bottom() - height() : geometry.top() + popup_pos_.y(); #ifndef Q_OS_WIN32 // windows needs negative coordinates for monitors // to the left or above the primary x = qBound(0, x, geometry.right() - width()); y = qBound(0, y, geometry.bottom() - height()); #endif move(x, y); // Create a mask for the actual area of the OSD QBitmap mask(size()); mask.clear(); QPainter p(&mask); p.setBrush(Qt::color1); p.drawRoundedRect(BoxBorder().adjusted(-1, -1, 0, 0), kBorderRadius, kBorderRadius); p.end(); // If there's no compositing window manager running then we have to set an // XShape mask. if (IsTransparencyAvailable()) clearMask(); else { setMask(mask); } #ifdef Q_OS_WIN32 // On windows, enable blurbehind on the masked area QtWin::enableBlurBehindWindow(this, true, QRegion(mask)); #endif }