Sfoglia il codice sorgente

ctkPopupWidget now supports QGradients

Julien Finet 14 anni fa
parent
commit
0b7169d810
1 ha cambiato i file con 62 aggiunte e 3 eliminazioni
  1. 62 3
      Libs/Widgets/ctkPopupWidget.cpp

+ 62 - 3
Libs/Widgets/ctkPopupWidget.cpp

@@ -63,6 +63,43 @@ public:
   bool AutoHide;
 };
 
+QGradient* duplicateGradient(const QGradient* gradient)
+{
+  QGradient* newGradient = 0;
+  switch (gradient->type())
+    {
+    case QGradient::LinearGradient:
+      {
+      const QLinearGradient* linearGradient = static_cast<const QLinearGradient*>(gradient);
+      newGradient = new QLinearGradient(linearGradient->start(), linearGradient->finalStop());
+      break;
+      }
+    case QGradient::RadialGradient:
+      {
+      const QRadialGradient* radialGradient = static_cast<const QRadialGradient*>(gradient);
+      newGradient = new QRadialGradient(radialGradient->center(), radialGradient->radius());
+      break;
+      }
+    case QGradient::ConicalGradient:
+      {
+      const QConicalGradient* conicalGradient = static_cast<const QConicalGradient*>(gradient);
+      newGradient = new QConicalGradient(conicalGradient->center(), conicalGradient->angle());
+      break;
+      }
+    default:
+      break;
+    }
+  if (!newGradient)
+    {
+    Q_ASSERT(gradient->type() != QGradient::NoGradient);
+    return newGradient;
+    }
+  newGradient->setCoordinateMode(gradient->coordinateMode());
+  newGradient->setSpread(gradient->spread());
+  newGradient->setStops(gradient->stops());
+  return newGradient;
+}
+
 // -------------------------------------------------------------------------
 ctkPopupWidgetPrivate::ctkPopupWidgetPrivate(ctkPopupWidget& object)
   :q_ptr(&object)
@@ -170,9 +207,31 @@ void ctkPopupWidget::paintEvent(QPaintEvent* event)
   Q_UNUSED(event);
 
   QPainter painter(this);
-  QColor semiTransparentColor = this->palette().window().color();
-  semiTransparentColor.setAlpha(d->CurrentAlpha);
-  painter.fillRect(this->rect(), semiTransparentColor);
+  QBrush brush = this->palette().window();
+  if (brush.style() == Qt::LinearGradientPattern ||
+      brush.style() == Qt::ConicalGradientPattern ||
+      brush.style() == Qt::RadialGradientPattern)
+    {
+    QGradient* newGradient = duplicateGradient(brush.gradient());
+    QGradientStops stops;
+    foreach(QGradientStop stop, newGradient->stops())
+      {
+      stop.second.setAlpha(d->CurrentAlpha);
+      stops.push_back(stop);
+      }
+    newGradient->setStops(stops);
+    brush = QBrush(*newGradient);
+    delete newGradient;
+    }
+  else
+    {
+    QColor color = brush.color();
+    color.setAlpha(d->CurrentAlpha);
+    brush.setColor(color);
+    }
+  //QColor semiTransparentColor = this->palette().window().color();
+  //semiTransparentColor.setAlpha(d->CurrentAlpha);
+  painter.fillRect(this->rect(), brush);
   this->Superclass::paintEvent(event);
 
   if (d->OpenState == ctkPopupWidgetPrivate::Opening &&  d->CurrentAlpha < d->Alpha)