diff options
-rw-r--r-- | muse2/ChangeLog | 3 | ||||
-rw-r--r-- | muse2/muse/widgets/knob.cpp | 102 | ||||
-rw-r--r-- | muse2/muse/widgets/knob.h | 4 |
3 files changed, 67 insertions, 42 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog index 7dc46580..9a3ff964 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,6 @@ +31.07.2011: + - Remodel the Knob (Orcan) + 28.07.2011: - speeded up structural operations (flo93) - fixed several heavy bugs in structural operations: (flo93) diff --git a/muse2/muse/widgets/knob.cpp b/muse2/muse/widgets/knob.cpp index 8257ff88..ae88e2f4 100644 --- a/muse2/muse/widgets/knob.cpp +++ b/muse2/muse/widgets/knob.cpp @@ -48,8 +48,8 @@ Knob::Knob(QWidget* parent, const char* name) { hasScale = false; - d_borderWidth = 2; - d_borderDist = 4; + d_borderWidth = 4; + d_shineWidth = 3; d_totalAngle = 270.0; d_scaleDist = 1; d_symbol = Line; @@ -57,9 +57,11 @@ Knob::Knob(QWidget* parent, const char* name) d_knobWidth = 30; _faceColSel = FALSE; d_faceColor = palette().color(QPalette::Window); + d_rimColor = palette().mid().color(); + d_shinyColor = palette().mid().color(); d_curFaceColor = d_faceColor; d_altFaceColor = d_faceColor; - d_markerColor = palette().color(QPalette::WindowText); + d_markerColor = palette().dark().color().darker(125); d_dotWidth = 8; setMinimumSize(30,30); @@ -98,39 +100,55 @@ void Knob::setTotalAngle (double angle) void Knob::drawKnob(QPainter* p, const QRect& r) { - QRect aRect; - const QPalette& pal = palette(); - QPen pn; - int bw2 = d_borderWidth / 2; - - aRect.setRect(r.x() + bw2, - r.y() + bw2, - r.width() - 2*bw2, - r.height() - 2*bw2); - - // - // draw button face - // - p->setPen(Qt::NoPen); - p->setBrush(d_curFaceColor); - p->drawEllipse(aRect); - - // - // draw button shades - // - pn.setWidth(d_borderWidth); + + QRect aRect; + aRect.setRect(r.x() + d_borderWidth, + r.y() + d_borderWidth, + r.width() - 2*d_borderWidth, + r.height() - 2*d_borderWidth); + + int width = r.width(); + int height = r.height(); + int size = qMin(width, height); + p->setRenderHint(QPainter::Antialiasing, true); - pn.setColor(pal.color(QPalette::Light)); - p->setPen(pn); - p->drawArc(aRect, 45*16,180*16); + // + // draw the rim + // + + QLinearGradient linearg(QPoint(r.x(),r.y()), QPoint(size, size)); + linearg.setColorAt(1 - M_PI_4, d_faceColor.lighter(125)); + linearg.setColorAt(M_PI_4, d_faceColor.darker(175)); + p->setBrush(linearg); + p->setPen(Qt::NoPen); + p->drawEllipse(r.x(),r.y(),size,size); - pn.setColor(pal.color(QPalette::Dark)); - p->setPen(pn); - p->drawArc(aRect, 225*16,180*16); // + // draw shiny surrounding + // + + QPen pn; + pn.setCapStyle(Qt::FlatCap); + pn.setColor(d_shinyColor.lighter(100+ abs(d_angle*100)/300)); + pn.setWidth(d_shineWidth * 2); + p->setPen(pn); + p->drawArc(aRect, 0, 360 * 16); + + // + // draw button face + // + + QRadialGradient gradient(size/2, size/2, size-d_borderWidth, size/2-d_borderWidth, size/2-d_borderWidth); + gradient.setColorAt(0, d_curFaceColor.lighter(150)); + gradient.setColorAt(1, d_curFaceColor.darker(150)); + p->setBrush(gradient); + p->setPen(Qt::NoPen); + p->drawEllipse(aRect); + + // // draw marker // //drawMarker(p, d_angle, isEnabled() ? d_markerColor : Qt::gray); @@ -358,10 +376,11 @@ void Knob::drawMarker(QPainter *p, double arc, const QColor &c) rarc = arc * M_PI / 180.0; double ca = cos(rarc); double sa = - sin(rarc); - radius = kRect.width() / 2 - d_borderWidth; + + radius = kRect.width() / 2 - d_borderWidth + d_shineWidth; if (radius < 3) radius = 3; - int ym = kRect.y() + radius + d_borderWidth; - int xm = kRect.x() + radius + d_borderWidth; + int ym = kRect.y() + radius + d_borderWidth - d_shineWidth; + int xm = kRect.x() + radius + d_borderWidth - d_shineWidth; switch (d_symbol) { @@ -382,14 +401,15 @@ void Knob::drawMarker(QPainter *p, double arc, const QColor &c) pn.setWidth(2); p->setPen(pn); - rb = qwtMax(double((radius - 4) / 3.0), 0.0); - re = qwtMax(double(radius - 4), 0.0); - - p->drawLine( xm - int(rint(sa * rb)), - ym - int(rint(ca * rb)), - xm - int(rint(sa * re)), - ym - int(rint(ca * re))); - + rb = qwtMax(double((radius - 1) / 3.0), 0.0); + re = qwtMax(double(radius - 1), 0.0); + + p->setRenderHint(QPainter::Antialiasing, true); + p->drawLine( xm, + ym, + xm - int(rint(sa * re)), + ym - int(rint(ca * re))); + break; } diff --git a/muse2/muse/widgets/knob.h b/muse2/muse/widgets/knob.h index 4da733ee..09e13c93 100644 --- a/muse2/muse/widgets/knob.h +++ b/muse2/muse/widgets/knob.h @@ -23,7 +23,7 @@ class Knob : public SliderBase, public ScaleIf bool hasScale; int d_borderWidth; - int d_borderDist; + int d_shineWidth; int d_scaleDist; int d_maxScaleTicks; int d_newVal; @@ -39,6 +39,8 @@ class Knob : public SliderBase, public ScaleIf QRect kRect; bool _faceColSel; QColor d_faceColor; + QColor d_shinyColor; + QColor d_rimColor; QColor d_curFaceColor; QColor d_altFaceColor; QColor d_markerColor; |