From 725b1d96a20557856fc1ceaf3d886bdd2f816826 Mon Sep 17 00:00:00 2001 From: Orcan Ogetbil Date: Mon, 12 Sep 2011 04:31:08 +0000 Subject: Improvements in rounding corners of meters, sliders; plus some other updates. See ChangeLog. --- muse2/ChangeLog | 8 ++ muse2/muse/mixer/rack.cpp | 7 +- muse2/muse/mixer/rack.h | 5 +- muse2/muse/plugin.cpp | 10 +- muse2/muse/widgets/meter.cpp | 176 +++++++++++++++++++++-------------- muse2/muse/widgets/meter.h | 1 + muse2/muse/widgets/slider.cpp | 100 ++++---------------- muse2/muse/widgets/slider.h | 3 - muse2/muse/widgets/utils.cpp | 52 +++++++++++ muse2/muse/widgets/utils.h | 6 ++ muse2/muse/widgets/verticalmeter.cpp | 143 ++++++++++++++++++++-------- 11 files changed, 309 insertions(+), 202 deletions(-) (limited to 'muse2') diff --git a/muse2/ChangeLog b/muse2/ChangeLog index a49709a5..b798bdeb 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,11 @@ +11.09.2011: + - Rewrote the rounding function for efficientcy. Moved the function into utils.cpp since it is written + for general purpose. (Orcan) + - The rounding in the meter is done in paintEvent now. I also enabled Antialiasing to make the corners + look nicer. Therefore I had to comment out Qt::WA_OpaquePaintEvent attributes in the meter and the + verticalmeter for now. Some testing needed. (Orcan) + - Plugin slider color codes are now generated from plugin ID numbers. (Orcan) + - Active plugins are colored in green in the rack. (Orcan) 09.09.2011: - Removed sending of SEQM_ADD_TRACK, SEQM_REMOVE_TRACK, SEQM_CHANGE_TRACK, SEQM_REMOVE_PART, and SEQM_CHANGE_PART to ALSA midi thread (which waits) from inside Audio::processMsg. diff --git a/muse2/muse/mixer/rack.cpp b/muse2/muse/mixer/rack.cpp index 9e7dc754..fdd80e60 100644 --- a/muse2/muse/mixer/rack.cpp +++ b/muse2/muse/mixer/rack.cpp @@ -84,9 +84,9 @@ void EffectRackDelegate::paint ( QPainter * painter, const QStyleOptionViewItem mask.setColorAt(1, mask_edge); mask.setStart(QPointF(0, cr.y())); mask.setFinalStop(QPointF(0, cr.y() + cr.height())); - + painter->setBrush(tr->efxPipe()->isOn(index.row()) ? - option.palette.mid() : + er->getActiveColor() : option.palette.dark()); painter->setPen(Qt::NoPen); painter->drawRoundedRect(cr, 2, 2); @@ -160,6 +160,7 @@ EffectRack::EffectRack(QWidget* parent, AudioTrack* t) track = t; itemheight = 19; setFont(MusEConfig::config.fonts[1]); + activeColor = QColor(74, 165, 49); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -186,7 +187,7 @@ void EffectRack::updateContents() for (int i = 0; i < PipelineDepth; ++i) { QString name = track->efxPipe()->name(i); item(i)->setText(name); - item(i)->setBackground(track->efxPipe()->isOn(i) ? palette().mid() : palette().dark()); + item(i)->setBackground(track->efxPipe()->isOn(i) ? activeColor : palette().dark()); item(i)->setToolTip(name == QString("empty") ? tr("effect rack") : name ); } } diff --git a/muse2/muse/mixer/rack.h b/muse2/muse/mixer/rack.h index a2f2a25a..65d112e9 100644 --- a/muse2/muse/mixer/rack.h +++ b/muse2/muse/mixer/rack.h @@ -44,7 +44,8 @@ class EffectRack : public QListWidget { AudioTrack* track; int itemheight; - + QColor activeColor; + virtual QSize minimumSizeHint() const; virtual QSize sizeHint() const; @@ -75,6 +76,8 @@ class EffectRack : public QListWidget { AudioTrack* getTrack() { return track; } QPoint getDragPos() { return dragPos; } + QColor getActiveColor() { return activeColor; } + }; #endif diff --git a/muse2/muse/plugin.cpp b/muse2/muse/plugin.cpp index f1793c0c..00b75dce 100644 --- a/muse2/muse/plugin.cpp +++ b/muse2/muse/plugin.cpp @@ -3599,8 +3599,12 @@ PluginGui::PluginGui(PluginIBase* p) params[i].label->setId(i); // Let sliders all have different but unique colors - uint hast = qHash(plugin->paramName(i)); - QColor color((uint) (hast * hast) % 16777216); + // Some prime number magic + uint j = i+1; + uint c1 = j * 211 % 256; + uint c2 = j * j * 137 % 256; + uint c3 = j * j * j * 43 % 256; + QColor color(c1, c2, c3); MusEWidget::Slider* s = new MusEWidget::Slider(0, "param", Qt::Horizontal, MusEWidget::Slider::None, color); @@ -3650,6 +3654,7 @@ PluginGui::PluginGui(PluginIBase* p) if (n2 > 0) { paramsOut = new GuiParam[n2]; + int h = fm.height() - 2; for (int i = 0; i < n2; ++i) { QLabel* label = 0; LADSPA_PortRangeHint range = plugin->rangeOut(i); @@ -3677,6 +3682,7 @@ PluginGui::PluginGui(PluginIBase* p) m->setRange(dlower, dupper); m->setVal(dval); + m->setFixedHeight(h); paramsOut[i].actuator = m; // paramsOut[i].label->setSlider((MusEWidget::Slider*)params[i].actuator); //paramsOut[i].actuator->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed)); diff --git a/muse2/muse/widgets/meter.cpp b/muse2/muse/widgets/meter.cpp index f4d907d1..e316a52a 100644 --- a/muse2/muse/widgets/meter.cpp +++ b/muse2/muse/widgets/meter.cpp @@ -30,6 +30,7 @@ #include #include "meter.h" +#include "utils.h" #include "gconfig.h" #include "fastlog.h" @@ -47,7 +48,8 @@ Meter::Meter(QWidget* parent, MeterType type) setAttribute(Qt::WA_StaticContents); // This is absolutely required for speed! Otherwise painfully slow because we get // full rect paint events even on small scrolls! See help on QPainter::scroll(). - setAttribute(Qt::WA_OpaquePaintEvent); + // Commented out for now. Orcan 20110911 + //setAttribute(Qt::WA_OpaquePaintEvent); //setFrameStyle(QFrame::Raised | QFrame::StyledPanel); mtype = type; @@ -61,6 +63,10 @@ Meter::Meter(QWidget* parent, MeterType type) setLineWidth(0); setMidLineWidth(0); + // rounding radii + xrad = 4; + yrad = 4; + dark_red_end = QColor(0x8e0000); dark_red_begin = QColor(0x8e3800); @@ -176,25 +182,24 @@ void Meter::setRange(double min, double max) // paintEvent //--------------------------------------------------------- -void Meter::paintEvent(QPaintEvent* /*ev*/) +void Meter::paintEvent(QPaintEvent* ev) { // TODO: Could make better use of event rectangle, for speed. QPainter p(this); - //p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::Antialiasing); double range = maxScale - minScale; int fw = frameWidth(); + /* int w = width() - 2*fw; int h = height() - 2*fw; - - // FIXME (Orcan): With the event rectangle we get corruption when we toggle the mono/stereo switch. Why? - /* - QRect rect = ev->rect(); - int w = rect.width(); - int h = rect.height(); */ + + QRect rect = ev->rect(); + int w = rect.width() - 2*fw; + int h = rect.height() - 2*fw; int yv; if(mtype == DBMeter) @@ -215,12 +220,15 @@ void Meter::paintEvent(QPaintEvent* /*ev*/) ymax = maxVal == 0 ? 0 : int(((maxScale - maxVal) * h)/range); p.setPen(peak_color); p.drawLine(0, ymax, w, ymax); - + // Draw the transparent layer on top of everything to give a 3d look + QPainterPath round_path = MusEUtil::roundedPath(0, 0, w, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); maskGrad.setStart(QPointF(0, 0)); maskGrad.setFinalStop(QPointF(w, 0)); - p.fillRect(0, 0, w, h, QBrush(maskGrad)); - + p.fillPath(round_path, QBrush(maskGrad)); + } @@ -250,47 +258,67 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv) lightGradRed.setStart(QPointF(0, 0)); lightGradRed.setFinalStop(QPointF(0, y1)); + QPainterPath p_top = MusEUtil::roundedPath(0, 0, w, y1, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + + QPainterPath p_bottom = MusEUtil::roundedPath(0, y2, w, h-y2, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); + if(yv < y1) { + + QPainterPath p_dark_red = MusEUtil::roundedPath(0, 0, w, yv, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + + p_top = p_top.subtracted(p_dark_red); + // Red section: - p.fillRect(0, 0, w, yv, QBrush(darkGradRed)); // dark red - p.fillRect(0, yv, w, y1-yv, QBrush(lightGradRed)); // light red - + p.fillPath(p_dark_red, QBrush(darkGradRed)); // dark red + p.fillPath(p_top, QBrush(lightGradRed)); // light red + // Yellow section: - p.fillRect(0, y1, w, y2-y1, QBrush(lightGradYellow)); // light yellow - + p.fillRect(0, y1, w, y2-y1, QBrush(lightGradYellow)); // light yellow + // Green section: - p.fillRect(0, y2, w, h-y2, QBrush(lightGradGreen)); // light green + p.fillPath(p_bottom, QBrush(lightGradGreen)); // light green } else if(yv < y2) { // Red section: - p.fillRect(0, 0, w, y1, QBrush(darkGradRed)); // dark red - + p.fillPath(p_top, QBrush(darkGradRed)); // dark red + // Yellow section: - p.fillRect(0, y1, w, yv-y1, QBrush(darkGradYellow)); // dark yellow - p.fillRect(0, yv, w, y2-yv, QBrush(lightGradYellow)); // light yellow - + p.fillRect(0, y1, w, yv-y1, QBrush(darkGradYellow)); // dark yellow + p.fillRect(0, yv, w, y2-yv, QBrush(lightGradYellow)); // light yellow + // Green section: - p.fillRect(0, y2, w, h-y2, QBrush(lightGradGreen)); // light green + p.fillPath(p_bottom, QBrush(lightGradGreen)); // light green } else //if(yv <= y3) { + QPainterPath p_light_green = MusEUtil::roundedPath(0, yv, w, h-yv, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); + p_bottom = p_bottom.subtracted(p_light_green); + // Red section: - p.fillRect(0, 0, w, y1, QBrush(darkGradRed)); // dark red - + p.fillPath(p_top, QBrush(darkGradRed)); // dark red + // Yellow section: - p.fillRect(0, y1, w, y2-y1, QBrush(darkGradYellow)); // dark yellow - + p.fillRect(0, y1, w, y2-y1, QBrush(darkGradYellow)); // dark yellow + // Green section: - p.fillRect(0, y2, w, yv-y2, QBrush(darkGradGreen)); // dark green - p.fillRect(0, yv, w, h-yv, QBrush(lightGradGreen)); // light green + p.fillPath(p_bottom, QBrush(darkGradGreen)); // dark green + p.fillPath(p_light_green, QBrush(lightGradGreen)); // light green } - p.fillRect(0,y1, w, 1, separator_color); - p.fillRect(0,y2, w, 1, separator_color); + p.fillRect(0,y1, w, 1, separator_color); + p.fillRect(0,y2, w, 1, separator_color); } else @@ -301,8 +329,49 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv) lightGradGreen.setStart(QPointF(0, 0)); lightGradGreen.setFinalStop(QPointF(0, h)); - p.fillRect(0, 0, w, yv, QBrush(darkGradGreen)); // dark green - p.fillRect(0, yv, w, h-yv, QBrush(lightGradGreen)); // light green + // We need to draw the meter in two parts. The cutoff for upper rectangle can be + // anywhere between yrad and h-yrad. Without loss of generality we pick the lower limit. + int cut = yrad; + + QPainterPath p_top = MusEUtil::roundedPath(0, 0, w, cut, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + + QPainterPath p_bottom = MusEUtil::roundedPath(0, cut, w, h-cut, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); + + if(yv < cut) + { + + QPainterPath p_dark = MusEUtil::roundedPath(0, 0, w, yv, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + + p_top = p_top.subtracted(p_dark); + + // top section: + p.fillPath(p_dark, QBrush(darkGradGreen)); // dark green + p.fillPath(p_top, QBrush(lightGradGreen)); // light green + + // bottom section: + p.fillPath(p_bottom, QBrush(lightGradGreen)); // light green + } + else + { + QPainterPath p_light = MusEUtil::roundedPath(0, yv, w, h-yv, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); + p_bottom = p_bottom.subtracted(p_light); + + // top section: + p.fillPath(p_top, QBrush(darkGradGreen)); // dark green + + // bottom section: + p.fillPath(p_bottom, QBrush(darkGradGreen)); // dark green + p.fillPath(p_light, QBrush(lightGradGreen)); // light green + } + } } @@ -311,43 +380,8 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv) // resizeEvent //--------------------------------------------------------- -void Meter::resizeEvent(QResizeEvent* ev) - { - // Round corners of the widget. - - QSize size = ev->size(); - int w = size.width(); - int h = size.height(); - QPainterPath rounded_rect; - rounded_rect.addRoundedRect(0,0,w,h, w/2.5, w/3); - QRegion maskregion(rounded_rect.toFillPolygon().toPolygon()); - setMask(maskregion); - - /* - // Another method to do the above. I don't know yet which one is more efficient - Orcan - QRect rect(0,0,w,h); - int r = 6; - - QRegion region; - // middle and borders - region += rect.adjusted(r, 0, -r, 0); - region += rect.adjusted(0, r, 0, -r); - // top left - QRect corner(rect.topLeft(), QSize(r*2, r*2)); - region += QRegion(corner, QRegion::Ellipse); - // top right - corner.moveTopRight(rect.topRight()); - region += QRegion(corner, QRegion::Ellipse); - // bottom left - corner.moveBottomLeft(rect.bottomLeft()); - region += QRegion(corner, QRegion::Ellipse); - // bottom right - corner.moveBottomRight(rect.bottomRight()); - region += QRegion(corner, QRegion::Ellipse); - // return region; - setMask(region); - */ - + void Meter::resizeEvent(QResizeEvent* /*ev*/) + { } //--------------------------------------------------------- diff --git a/muse2/muse/widgets/meter.h b/muse2/muse/widgets/meter.h index 62ad3fe0..06f35ca2 100644 --- a/muse2/muse/widgets/meter.h +++ b/muse2/muse/widgets/meter.h @@ -72,6 +72,7 @@ class Meter : public QFrame { QColor separator_color;; QColor peak_color; + int xrad, yrad; private: MeterType mtype; diff --git a/muse2/muse/widgets/slider.cpp b/muse2/muse/widgets/slider.cpp index f50c144a..b9803fca 100644 --- a/muse2/muse/widgets/slider.cpp +++ b/muse2/muse/widgets/slider.cpp @@ -27,6 +27,7 @@ #include #include +#include "utils.h" #include "slider.h" namespace MusEWidget { @@ -167,73 +168,6 @@ void Slider::fontChange(const QFont & /*oldFont*/) repaint(); } -//------------------------------------------------------------ -// -// roundedPath -// Returns a rectangle with rounded corners -// -// roundCorner can be an bitwise-or combination of -// UpperLeft, UpperRight, LowerRight, LowerLeft -//------------------------------------------------------------ -QPainterPath Slider::roundedPath(QRect r, int xrad, int yrad, RoundCorner roundCorner) -{ - return roundedPath(r.x(), r.y(), - r.width(), r.height(), - xrad, yrad, - roundCorner); -} - -QPainterPath Slider::roundedPath(int x, int y, int w, int h, int xrad, int yrad, RoundCorner roundCorner) -{ - QPainterPath rounded_rect; - rounded_rect.addRect(x, y + yrad, w, h - 2 * yrad); - if (roundCorner & UpperLeft) - { - rounded_rect.moveTo(x + xrad, y + yrad); - rounded_rect.arcTo(x, y, xrad*2, yrad*2, 180, -90); - } - else - { - rounded_rect.moveTo(x, y + yrad); - rounded_rect.lineTo(x,y); - rounded_rect.lineTo(x + xrad, y); - } - - rounded_rect.lineTo(x + w - xrad, y); - - if (roundCorner & UpperRight) - rounded_rect.arcTo(x + w - xrad * 2, y, xrad*2, yrad*2, 90, -90); - else - { - rounded_rect.lineTo(x + w, y); - rounded_rect.lineTo(x + w, y + yrad); - } - - if (roundCorner & LowerLeft) - { - rounded_rect.moveTo(x + xrad, y + h - yrad); - rounded_rect.arcTo(x, y + h - yrad*2, xrad*2, yrad*2, 180, 90); - } - else - { - rounded_rect.moveTo(x, y + h - yrad); - rounded_rect.lineTo(x, y + h); - rounded_rect.lineTo(x + xrad, y + h); - } - - rounded_rect.lineTo(x + w - xrad, y + h); - - if (roundCorner & LowerRight) - rounded_rect.arcTo(x + w - xrad*2, y + h - yrad*2, xrad*2, yrad*2, 270, 90); - else - { - rounded_rect.lineTo(x + w, y + h); - rounded_rect.lineTo(x + w, y + h - yrad); - } - - return rounded_rect; -} - //------------------------------------------------------------ // drawSlider // Draw the slider into the specified rectangle. @@ -315,9 +249,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r) // // Draw background // - QPainterPath bg_rect = roundedPath(cr, + QPainterPath bg_rect = MusEUtil::roundedPath(cr, xrad, yrad, - (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) ); + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) ); p->fillPath(bg_rect, d_fillColor); @@ -333,9 +267,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r) e_mask.setStart(QPointF(0, cr.y())); e_mask.setFinalStop(QPointF(0, cr.y() + cr.height())); - QPainterPath e_rect = roundedPath(ipos + d_thumbLength, cr.y(), + QPainterPath e_rect = MusEUtil::roundedPath(ipos + d_thumbLength, cr.y(), cr.width() - d_thumbLength - dist1, cr.height(), - xrad, yrad, (RoundCorner) (UpperRight | LowerRight) ); + xrad, yrad, (MusEUtil::Corner) (MusEUtil::UpperRight | MusEUtil::LowerRight) ); p->fillPath(e_rect, QBrush(e_mask)); @@ -347,10 +281,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r) f_mask.setStart(QPointF(0, cr.y())); f_mask.setFinalStop(QPointF(0, cr.y() + cr.height())); - QPainterPath f_rect = roundedPath(cr.x(), cr.y(), + QPainterPath f_rect = MusEUtil::roundedPath(cr.x(), cr.y(), ipos + 1, cr.height(), xrad, yrad, - (RoundCorner) (LowerLeft | UpperLeft) ); + (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::UpperLeft) ); p->fillPath(f_rect, QBrush(f_mask)); @@ -359,10 +293,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r) // Draw thumb // - QPainterPath thumb_rect = roundedPath(ipos, r.y(), + QPainterPath thumb_rect = MusEUtil::roundedPath(ipos, r.y(), d_thumbLength, r.height(), 2, 2, - (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) ); + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) ); thumbGrad.setStart(QPointF(0, cr.y())); thumbGrad.setFinalStop(QPointF(0, cr.y() + cr.height())); @@ -387,9 +321,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r) // // Draw background // - QPainterPath bg_rect = roundedPath(cr, + QPainterPath bg_rect = MusEUtil::roundedPath(cr, xrad, yrad, - (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) ); + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) ); p->fillPath(bg_rect, d_fillColor); @@ -405,10 +339,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r) e_mask.setStart(QPointF(cr.x(), 0)); e_mask.setFinalStop(QPointF(cr.x() + cr.width(), 0)); - QPainterPath e_rect = roundedPath(cr.x(), cr.y(), + QPainterPath e_rect = MusEUtil::roundedPath(cr.x(), cr.y(), cr.width(), ipos + 1, xrad, yrad, - (RoundCorner) (UpperLeft | UpperRight) ); + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight) ); p->fillPath(e_rect, QBrush(e_mask)); @@ -420,9 +354,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r) f_mask.setStart(QPointF(cr.x(), 0)); f_mask.setFinalStop(QPointF(cr.x() + cr.width(), 0)); - QPainterPath f_rect = roundedPath(cr.x(), ipos + d_thumbLength, + QPainterPath f_rect = MusEUtil::roundedPath(cr.x(), ipos + d_thumbLength, cr.width(), cr.height() - d_thumbLength - dist1, - xrad, yrad, (RoundCorner) (LowerLeft | LowerRight) ); + xrad, yrad, (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight) ); p->fillPath(f_rect, QBrush(f_mask)); @@ -431,10 +365,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r) // Draw thumb // - QPainterPath thumb_rect = roundedPath(r.x(), ipos, + QPainterPath thumb_rect = MusEUtil::roundedPath(r.x(), ipos, r.width(), d_thumbLength, 2, 2, - (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) ); + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) ); thumbGrad.setStart(QPointF(cr.x(), 0)); thumbGrad.setFinalStop(QPointF(cr.x() + cr.width(), 0)); diff --git a/muse2/muse/widgets/slider.h b/muse2/muse/widgets/slider.h index a76c5270..861d8f4b 100644 --- a/muse2/muse/widgets/slider.h +++ b/muse2/muse/widgets/slider.h @@ -42,7 +42,6 @@ class Slider : public SliderBase, public ScaleIf public: enum ScalePos { None, Left, Right, Top, Bottom }; - enum RoundCorner { UpperLeft = 0x1, UpperRight = 0x2, LowerLeft = 0x4, LowerRight = 0x8 }; private: Q_PROPERTY( double lineStep READ lineStep WRITE setLineStep ) @@ -70,8 +69,6 @@ class Slider : public SliderBase, public ScaleIf int d_bgStyle; int markerPos; - QPainterPath roundedPath(int x, int y, int w, int h, int xrad, int yrad, RoundCorner roundCorner); - QPainterPath roundedPath(QRect r, int xrad, int yrad, RoundCorner roundCorner); void drawHsBgSlot(QPainter *, const QRect&, const QRect&,const QBrush&); void drawVsBgSlot(QPainter *, const QRect&, const QRect&,const QBrush&); diff --git a/muse2/muse/widgets/utils.cpp b/muse2/muse/widgets/utils.cpp index e46d265c..1ed9001a 100644 --- a/muse2/muse/widgets/utils.cpp +++ b/muse2/muse/widgets/utils.cpp @@ -404,4 +404,56 @@ QGradient gGradientFromQColor(const QColor& c, const QPointF& start, const QPoin return gradient; } +QPainterPath roundedPath(QRect r, int xrad, int yrad, Corner roundCorner) +{ + return roundedPath(r.x(), r.y(), + r.width(), r.height(), + xrad, yrad, + roundCorner); +} + +QPainterPath roundedPath(int x, int y, int w, int h, int xrad, int yrad, Corner roundCorner) +{ + QPainterPath rounded_rect; + rounded_rect.addRect(x, y, w, h); + + if (roundCorner & UpperLeft) + { + QPainterPath top_left_corner; + top_left_corner.addRect(x, y, xrad, yrad); + top_left_corner.moveTo(x + xrad, y + yrad); + top_left_corner.arcTo(x, y, xrad*2, yrad*2, 180, -90); + rounded_rect = rounded_rect.subtracted(top_left_corner); + } + + if (roundCorner & UpperRight) + { + QPainterPath top_right_corner; + top_right_corner.addRect(x + w - xrad, y, xrad, yrad); + top_right_corner.moveTo(x + w - xrad, y + yrad); + top_right_corner.arcTo(x + w - xrad * 2, y, xrad*2, yrad*2, 90, -90); + rounded_rect = rounded_rect.subtracted(top_right_corner); + } + + if (roundCorner & LowerLeft) + { + QPainterPath bottom_left_corner; + bottom_left_corner.addRect(x, y + h - yrad, xrad, yrad); + bottom_left_corner.moveTo(x + xrad, y + h - yrad); + bottom_left_corner.arcTo(x, y + h - yrad*2, xrad*2, yrad*2, 180, 90); + rounded_rect = rounded_rect.subtracted(bottom_left_corner); + } + + if (roundCorner & LowerRight) + { + QPainterPath bottom_right_corner; + bottom_right_corner.addRect(x + w - xrad, y + h - yrad, xrad, yrad); + bottom_right_corner.moveTo(x + w - xrad, y + h - yrad); + bottom_right_corner.arcTo(x + w - xrad*2, y + h - yrad*2, xrad*2, yrad*2, 270, 90); + rounded_rect = rounded_rect.subtracted(bottom_right_corner); + } + + return rounded_rect; +} + } // namespace MusEUtils diff --git a/muse2/muse/widgets/utils.h b/muse2/muse/widgets/utils.h index b74ba394..c6e1ad6b 100644 --- a/muse2/muse/widgets/utils.h +++ b/muse2/muse/widgets/utils.h @@ -30,9 +30,12 @@ class QGradient; class QCanvas; class QPointF; class QColor; +class QPainterPath; namespace MusEUtil { +enum Corner { UpperLeft = 0x1, UpperRight = 0x2, LowerLeft = 0x4, LowerRight = 0x8 }; + extern QString bitmap2String(int bm); extern int string2bitmap(const QString& str); extern QString u32bitmap2String(unsigned int bm); @@ -46,6 +49,9 @@ extern QFrame* vLine(QWidget* parent); extern void dump(const unsigned char* p, int n); extern double curTime(); +extern QPainterPath roundedPath(QRect r, int xrad, int yrad, Corner roundCorner); +extern QPainterPath roundedPath(int x, int y, int w, int h, int xrad, int yrad, Corner roundCorner); + } // namespace MusEUtils #endif diff --git a/muse2/muse/widgets/verticalmeter.cpp b/muse2/muse/widgets/verticalmeter.cpp index b0e0198f..83baa83b 100644 --- a/muse2/muse/widgets/verticalmeter.cpp +++ b/muse2/muse/widgets/verticalmeter.cpp @@ -31,6 +31,8 @@ #include "verticalmeter.h" #include "gconfig.h" #include "fastlog.h" +#include "mmath.h" +#include "utils.h" namespace MusEWidget { @@ -46,7 +48,8 @@ VerticalMeter::VerticalMeter(QWidget* parent, MeterType type) setAttribute(Qt::WA_StaticContents); // This is absolutely required for speed! Otherwise painfully slow because we get // full rect paint events even on small scrolls! See help on QPainter::scroll(). - setAttribute(Qt::WA_OpaquePaintEvent); + // Commented out for now. Orcan 20110911 + //setAttribute(Qt::WA_OpaquePaintEvent); mtype = type; overflow = false; @@ -56,6 +59,9 @@ VerticalMeter::VerticalMeter(QWidget* parent, MeterType type) maxScale = mtype == DBMeter ? 10.0 : 127.0; yellowScale = -10; redScale = 0; + xrad = 4; + yrad = 4; + setLineWidth(0); setMidLineWidth(0); } @@ -129,18 +135,19 @@ void VerticalMeter::paintEvent(QPaintEvent* ev) // TODO: Could make better use of event rectangle, for speed. QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); double range = maxScale - minScale; - /* int fw = frameWidth(); + /* int w = width() - 2*fw; int h = height() - 2*fw; */ QRect rect = ev->rect(); - int w = rect.width(); - int h = rect.height(); + int w = rect.width() - 2*fw; + int h = rect.height() - 2*fw; int xv; @@ -157,18 +164,23 @@ void VerticalMeter::paintEvent(QPaintEvent* ev) drawVU(p, w, h, xv); // Draw the peak white line. + /* int xcenter; if(mtype == DBMeter) xcenter = maxVal == 0 ? 0 : int(((maxScale - (fast_log10(0) * 20.0)) * w)/range); else - xcenter = maxVal == 0 ? 0 : int(((0) * w)/range); + xcenter = maxVal == 0 ? 0 : int(((maxVal) * w)/range); p.setPen(peak_color); p.drawLine(xcenter, 0, xcenter, h); + */ // Draw the transparent layer on top of everything to give a 3d look + QPainterPath round_path = roundedPath(0, 0, w, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); maskGrad.setStart(QPointF(0, 0)); maskGrad.setFinalStop(QPointF(0, h)); - p.fillRect(0, 0, w, h, QBrush(maskGrad)); + p.fillPath(round_path, QBrush(maskGrad)); } //--------------------------------------------------------- @@ -177,7 +189,7 @@ void VerticalMeter::paintEvent(QPaintEvent* ev) void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv) { - if(mtype == DBMeter) + if(mtype == DBMeter) { double range = maxScale - minScale; int x1 = int((maxScale - redScale) * w / range); @@ -197,44 +209,65 @@ void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv) lightGradRed.setStart(QPointF(0, 0)); lightGradRed.setFinalStop(QPointF(x1, 0)); + QPainterPath p_left = roundedPath(0, 0, x1, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) ); + + QPainterPath p_right = roundedPath(x2, 0, w-x2, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerRight | MusEUtil::UpperRight ) ); if(xv < x1) { - // Red section: - p.fillRect(0, 0, xv, h, QBrush(darkGradRed)); // dark red - p.fillRect(xv, 0, x1-xv, h, QBrush(lightGradRed)); // light red - + + QPainterPath p_light_green = roundedPath(0, 0, xv, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) ); + + p_left = p_left.subtracted(p_light_green); + + // Green section: + p.fillPath(p_light_green, QBrush(lightGradGreen)); // light green + p.fillPath(p_left, QBrush(darkGradGreen)); // dark green + // Yellow section: - p.fillRect(x1, 0, x2-x1, h, QBrush(lightGradYellow)); // light yellow + p.fillRect(x1, 0, x2-x1, h, QBrush(darkGradYellow)); // dark yellow - // Green section: - p.fillRect(x2, 0, w-x2, h, QBrush(lightGradGreen)); // light green + // Red section: + p.fillPath(p_right, QBrush(darkGradRed)); // dark red } else if(xv < x2) { - // Red section: - p.fillRect(0, 0, x1, h, QBrush(darkGradRed)); // dark red + // Green section: + p.fillPath(p_left, QBrush(lightGradGreen)); // light green // Yellow section: - p.fillRect(x1, 0, xv-x1, h, QBrush(darkGradYellow)); // dark yellow - p.fillRect(xv, 0, x2-xv, h, QBrush(lightGradYellow)); // light yellow + p.fillRect(x1, 0, xv-x1, h, QBrush(lightGradYellow)); // light yellow + p.fillRect(xv, 0, x2-xv, h, QBrush(darkGradYellow)); // dark yellow - // Green section: - p.fillRect(x2, 0, w-x2, h, QBrush(lightGradGreen)); // light green + // Red section: + p.fillPath(p_right, QBrush(darkGradRed)); // dark red } else - //if(yv <= y3) + //if(xv <= x3) { - // Red section: - p.fillRect(0, 0, x1, h, QBrush(darkGradRed)); // dark red + QPainterPath p_dark_red = roundedPath(xv, 0, w-xv, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerRight | MusEUtil::UpperRight ) ); + + p_right = p_right.subtracted(p_dark_red); + + // Green section: + p.fillPath(p_left, QBrush(lightGradGreen)); // light green // Yellow section: - p.fillRect(x1, 0, x2-x1, h, QBrush(darkGradYellow)); // dark yellow + p.fillRect(x1, 0, x2-x1, h, QBrush(lightGradYellow)); // light yellow - // Green section: - p.fillRect(x2, 0, xv-x2, h, QBrush(darkGradGreen)); // dark green - p.fillRect(xv, 0, w-xv, h, QBrush(lightGradGreen)); // light green + // Red section: + p.fillPath(p_right, QBrush(lightGradRed)); // light red + p.fillPath(p_dark_red, QBrush(darkGradRed)); // dark red + } p.fillRect(x1,0, 1, h, separator_color); @@ -249,8 +282,49 @@ void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv) lightGradGreen.setStart(QPointF(0, 0)); lightGradGreen.setFinalStop(QPointF(w, 0)); - p.fillRect(0, 0, xv, h, QBrush(lightGradGreen)); // light green - p.fillRect(xv, 0, w-xv, h, QBrush(darkGradGreen)); // dark green + // We need to draw the meter in two parts. The cutoff for the left rectangle can be + // anywhere between xrad and w-xrad. Without loss of generality we pick the lower limit. + int cut = xrad; + + QPainterPath p_left = roundedPath(0, 0, cut, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) ); + + QPainterPath p_right = roundedPath(cut, 0, w-cut, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::LowerRight | MusEUtil::UpperRight ) ); + + if(xv < cut) + { + + QPainterPath p_light = roundedPath(0, 0, xv, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) ); + + p_left = p_left.subtracted(p_light); + + // left section: + p.fillPath(p_left, QBrush(darkGradGreen)); // dark green + p.fillPath(p_light, QBrush(lightGradGreen)); // light green + + // bottom section: + p.fillPath(p_right, QBrush(darkGradGreen)); // dark green + } + else + { + QPainterPath p_dark = roundedPath(xv, 0, w-xv, h, + xrad, yrad, + (MusEUtil::Corner) (MusEUtil::UpperRight | MusEUtil::LowerRight ) ); + p_right = p_right.subtracted(p_dark); + + // left section: + p.fillPath(p_left, QBrush(lightGradGreen)); // light green + + // right section: + p.fillPath(p_dark, QBrush(darkGradGreen)); // dark green + p.fillPath(p_right, QBrush(lightGradGreen)); // light green + } + } } @@ -259,17 +333,8 @@ void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv) // resizeEvent //--------------------------------------------------------- -void VerticalMeter::resizeEvent(QResizeEvent* ev) +void VerticalMeter::resizeEvent(QResizeEvent* /*ev*/) { - // Round corners of the widget. - - QSize size = ev->size(); - int w = size.width(); - int h = size.height(); - QPainterPath rounded_rect; - rounded_rect.addRoundedRect(0,0,w,h, h/3, h/2.5); - QRegion maskregion(rounded_rect.toFillPolygon().toPolygon()); - setMask(maskregion); } } // namespace MusEWidget -- cgit v1.2.3