From d97157b7f17959d0ec2e5136fc488818b657c5eb Mon Sep 17 00:00:00 2001 From: falkTX Date: Thu, 16 Aug 2012 23:15:28 +0100 Subject: [PATCH] Minor optimizations and syntax changes --- .gitignore | 2 + c++/widgets/digitalpeakmeter.cpp | 48 +++++----- c++/widgets/pixmapdial.cpp | 144 +++++++++++++++++++++++------- c++/widgets/pixmapdial.h | 10 +-- c++/xycontroller/xycontroller.cpp | 10 ++- src/digitalpeakmeter.py | 2 +- src/pixmapdial.py | 51 +++++------ 7 files changed, 174 insertions(+), 93 deletions(-) diff --git a/.gitignore b/.gitignore index 1db9615..52e8cf9 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ *.pyc ui_*.py +*.moc moc_*.cpp ui_*.h @@ -33,6 +34,7 @@ carla-discovery-unix64 c++/carla-backend/doxygen/ c++/carla-includes/vst/ c++/jackmeter/cadence_jackmeter +c++/xycontroller/cadence_xycontroller c++/*/*-build-*-Debug/ c++/*/*-build-*-Release/ diff --git a/c++/widgets/digitalpeakmeter.cpp b/c++/widgets/digitalpeakmeter.cpp index 8d9948e..d2fb0c7 100644 --- a/c++/widgets/digitalpeakmeter.cpp +++ b/c++/widgets/digitalpeakmeter.cpp @@ -95,21 +95,21 @@ void DigitalPeakMeter::setOrientation(Orientation orientation) if (m_orientation == HORIZONTAL) { - m_gradientMeter.setColorAt(0.0, m_colorBase); - m_gradientMeter.setColorAt(0.2, m_colorBase); - m_gradientMeter.setColorAt(0.4, m_colorBase); - m_gradientMeter.setColorAt(0.6, m_colorBase); - m_gradientMeter.setColorAt(0.8, Qt::yellow); - m_gradientMeter.setColorAt(1.0, Qt::red); + m_gradientMeter.setColorAt(0.0f, m_colorBase); + m_gradientMeter.setColorAt(0.2f, m_colorBase); + m_gradientMeter.setColorAt(0.4f, m_colorBase); + m_gradientMeter.setColorAt(0.6f, m_colorBase); + m_gradientMeter.setColorAt(0.8f, Qt::yellow); + m_gradientMeter.setColorAt(1.0f, Qt::red); } else if (m_orientation == VERTICAL) { - m_gradientMeter.setColorAt(0.0, Qt::red); - m_gradientMeter.setColorAt(0.2, Qt::yellow); - m_gradientMeter.setColorAt(0.4, m_colorBase); - m_gradientMeter.setColorAt(0.6, m_colorBase); - m_gradientMeter.setColorAt(0.8, m_colorBase); - m_gradientMeter.setColorAt(1.0, m_colorBase); + m_gradientMeter.setColorAt(0.0f, Qt::red); + m_gradientMeter.setColorAt(0.2f, Qt::yellow); + m_gradientMeter.setColorAt(0.4f, m_colorBase); + m_gradientMeter.setColorAt(0.6f, m_colorBase); + m_gradientMeter.setColorAt(0.8f, m_colorBase); + m_gradientMeter.setColorAt(1.0f, m_colorBase); } else return qCritical("DigitalPeakMeter::setOrientation(%i) - invalid orientation", orientation); @@ -220,21 +220,21 @@ void DigitalPeakMeter::paintEvent(QPaintEvent*) // Base painter.setPen(m_colorBaseT); - painter.drawLine(lsmall * 0.25, 2, lsmall * 0.25, lfull-2); - painter.drawLine(lsmall * 0.50, 2, lsmall * 0.50, lfull-2); + painter.drawLine(lsmall * 0.25f, 2, lsmall * 0.25f, lfull-2); + painter.drawLine(lsmall * 0.50f, 2, lsmall * 0.50f, lfull-2); // Yellow painter.setPen(QColor(110, 110, 15, 100)); - painter.drawLine(lsmall * 0.70, 2, lsmall * 0.70, lfull-2); - painter.drawLine(lsmall * 0.83, 2, lsmall * 0.83, lfull-2); + painter.drawLine(lsmall * 0.70f, 2, lsmall * 0.70f, lfull-2); + painter.drawLine(lsmall * 0.83f, 2, lsmall * 0.83f, lfull-2); // Orange painter.setPen(QColor(180, 110, 15, 100)); - painter.drawLine(lsmall * 0.90, 2, lsmall * 0.90, lfull-2); + painter.drawLine(lsmall * 0.90f, 2, lsmall * 0.90f, lfull-2); // Red painter.setPen(QColor(110, 15, 15, 100)); - painter.drawLine(lsmall * 0.96, 2, lsmall * 0.96, lfull-2); + painter.drawLine(lsmall * 0.96f, 2, lsmall * 0.96f, lfull-2); } else if (m_orientation == VERTICAL) @@ -245,21 +245,21 @@ void DigitalPeakMeter::paintEvent(QPaintEvent*) // Base painter.setPen(m_colorBaseT); - painter.drawLine(2, lsmall - (lsmall * 0.25), lfull-2, lsmall - (lsmall * 0.25)); - painter.drawLine(2, lsmall - (lsmall * 0.50), lfull-2, lsmall - (lsmall * 0.50)); + painter.drawLine(2, lsmall - (lsmall * 0.25f), lfull-2, lsmall - (lsmall * 0.25f)); + painter.drawLine(2, lsmall - (lsmall * 0.50f), lfull-2, lsmall - (lsmall * 0.50f)); // Yellow painter.setPen(QColor(110, 110, 15, 100)); - painter.drawLine(2, lsmall - (lsmall * 0.70), lfull-2, lsmall - (lsmall * 0.70)); - painter.drawLine(2, lsmall - (lsmall * 0.83), lfull-2, lsmall - (lsmall * 0.83)); + painter.drawLine(2, lsmall - (lsmall * 0.70f), lfull-2, lsmall - (lsmall * 0.70f)); + painter.drawLine(2, lsmall - (lsmall * 0.83f), lfull-2, lsmall - (lsmall * 0.83f)); // Orange painter.setPen(QColor(180, 110, 15, 100)); - painter.drawLine(2, lsmall - (lsmall * 0.90), lfull-2, lsmall - (lsmall * 0.90)); + painter.drawLine(2, lsmall - (lsmall * 0.90f), lfull-2, lsmall - (lsmall * 0.90f)); // Red painter.setPen(QColor(110, 15, 15, 100)); - painter.drawLine(2, lsmall - (lsmall * 0.96), lfull-2, lsmall - (lsmall * 0.96)); + painter.drawLine(2, lsmall - (lsmall * 0.96f), lfull-2, lsmall - (lsmall * 0.96f)); } } diff --git a/c++/widgets/pixmapdial.cpp b/c++/widgets/pixmapdial.cpp index 0753663..2f60a15 100644 --- a/c++/widgets/pixmapdial.cpp +++ b/c++/widgets/pixmapdial.cpp @@ -20,8 +20,8 @@ #include #include -PixmapDial::PixmapDial(QWidget* parent): - QDial(parent) +PixmapDial::PixmapDial(QWidget* parent) + : QDial(parent) { m_pixmap.load(":/bitmaps/dial_01d.png"); m_pixmap_n_str = "01"; @@ -36,7 +36,7 @@ PixmapDial::PixmapDial(QWidget* parent): m_orientation = VERTICAL; m_label = ""; - m_label_pos = QPointF(0.0, 0.0); + m_label_pos = QPointF(0.0f, 0.0f); m_label_width = 0; m_label_height = 0; m_label_gradient = QLinearGradient(0, 0, 0, 1); @@ -91,27 +91,23 @@ void PixmapDial::setLabel(QString label) m_label_width = QFontMetrics(font()).width(label); m_label_height = QFontMetrics(font()).height(); - m_label_pos.setX((p_size/2)-(m_label_width/2)); - m_label_pos.setY(p_size+m_label_height); + m_label_pos.setX(float(p_size)/2 - float(m_label_width)/2); + m_label_pos.setY(p_size + m_label_height); - m_label_gradient.setColorAt(0.0, m_color1); - m_label_gradient.setColorAt(0.6, m_color1); - m_label_gradient.setColorAt(1.0, m_color2); + m_label_gradient.setColorAt(0.0f, m_color1); + m_label_gradient.setColorAt(0.6f, m_color1); + m_label_gradient.setColorAt(1.0f, m_color2); - m_label_gradient.setStart(0, p_size/2); + m_label_gradient.setStart(0, float(p_size)/2); m_label_gradient.setFinalStop(0, p_size+m_label_height+5); - m_label_gradient_rect = QRectF(p_size*1/8, p_size/2, p_size*6/8, p_size+m_label_height+5); + m_label_gradient_rect = QRectF(float(p_size)/8, float(p_size)/2, float(p_size*6)/8, p_size+m_label_height+5); update(); } -void PixmapDial::setPixmap(int pixmap_id) +void PixmapDial::setPixmap(int pixmapId) { - if (pixmap_id > 10) - m_pixmap_n_str = QString::number(pixmap_id); - else - m_pixmap_n_str = QString("0%1").arg(pixmap_id); - + m_pixmap_n_str.sprintf("%02i", pixmapId); m_pixmap.load(QString(":/bitmaps/dial_%1%2.png").arg(m_pixmap_n_str).arg(isEnabled() ? "" : "d")); if (m_pixmap.width() > m_pixmap.height()) @@ -163,7 +159,7 @@ void PixmapDial::enterEvent(QEvent* event) { m_hovered = true; if (m_hover_step == HOVER_MIN) - m_hover_step = HOVER_MIN + 1; + m_hover_step += 1; QDial::enterEvent(event); } @@ -171,7 +167,7 @@ void PixmapDial::leaveEvent(QEvent* event) { m_hovered = false; if (m_hover_step == HOVER_MAX) - m_hover_step = HOVER_MAX - 1; + m_hover_step -= 1; QDial::leaveEvent(event); } @@ -185,12 +181,10 @@ void PixmapDial::paintEvent(QPaintEvent*) painter.setBrush(m_label_gradient); painter.drawRect(m_label_gradient_rect); - painter.setPen(isEnabled() ? m_colorT[0] : m_colorT[1]); + painter.setPen(m_colorT[isEnabled() ? 0 : 1]); painter.drawText(m_label_pos, m_label); } - QRectF target, source; - if (isEnabled()) { float current = value()-minimum(); @@ -199,19 +193,19 @@ void PixmapDial::paintEvent(QPaintEvent*) if (divider == 0.0f) return; - target = QRectF(0.0, 0.0, p_size, p_size); float value = current/divider; + QRectF source, target(0.0f, 0.0f, p_size, p_size); - int xpos, ypos, per = int((p_count-1) * value); + int xpos, ypos, per = (p_count-1)*value; if (m_orientation == HORIZONTAL) { xpos = p_size*per; - ypos = 0.0; + ypos = 0.0f; } else { - xpos = 0.0; + xpos = 0.0f; ypos = p_size*per; } @@ -219,12 +213,99 @@ void PixmapDial::paintEvent(QPaintEvent*) painter.drawPixmap(target, m_pixmap, source); // Custom knobs (Dry/Wet and Volume) - // TODO - + if (m_custom_paint == CUSTOM_PAINT_CARLA_WET || m_custom_paint == CUSTOM_PAINT_CARLA_VOL) + { + // knob color + QColor colorGreen(0x5D, 0xE7, 0x3D, 191 + m_hover_step*7); + QColor colorBlue(0x3E, 0xB8, 0xBE, 191 + m_hover_step*7); + + // draw small circle + QRectF ballRect(8.0, 8.0, 15.0, 15.0); + QPainterPath ballPath; + ballPath.addEllipse(ballRect); + //painter.drawRect(ballRect); + float tmpValue = (0.375f + 0.75f*value); + float ballValue = tmpValue - floorf(tmpValue); + QPointF ballPoint(ballPath.pointAtPercent(ballValue)); + + // draw arc + int startAngle = 216*16; + int spanAngle = -252*16*value; + + if (m_custom_paint == CUSTOM_PAINT_CARLA_WET) + { + painter.setBrush(colorBlue); + painter.setPen(QPen(colorBlue, 0)); + painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.2, 2.2)); + + QConicalGradient gradient(15.5, 15.5, -45); + gradient.setColorAt(0.0, colorBlue); + gradient.setColorAt(0.125, colorBlue); + gradient.setColorAt(0.625, colorGreen); + gradient.setColorAt(0.75, colorGreen); + gradient.setColorAt(0.76, colorGreen); + gradient.setColorAt(1.0, colorGreen); + painter.setBrush(gradient); + painter.setPen(QPen(gradient, 3)); + } + else + { + painter.setBrush(colorBlue); + painter.setPen(QPen(colorBlue, 0)); + painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.2, 2.2)); + + painter.setBrush(colorBlue); + painter.setPen(QPen(colorBlue, 3)); + } + + painter.drawArc(4.0, 4.0, 26.0, 26.0, startAngle, spanAngle); + } // Custom knobs (L and R) - // TODO + else if (m_custom_paint == CUSTOM_PAINT_CARLA_L || m_custom_paint == CUSTOM_PAINT_CARLA_R) + { + // knob color + QColor color(0xAD + m_hover_step*5, 0xD5 + m_hover_step*4, 0x4B + m_hover_step*5); + + // draw small circle + QRectF ballRect(7.0, 8.0, 11.0, 12.0); + QPainterPath ballPath; + ballPath.addEllipse(ballRect); + //painter.drawRect(ballRect); + float tmpValue = (0.375f + 0.75f*value); + float ballValue = tmpValue - floorf(tmpValue); + QPointF ballPoint(ballPath.pointAtPercent(ballValue)); + + painter.setBrush(color); + painter.setPen(QPen(color, 0)); + painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.0f, 2.0f)); + + int startAngle, spanAngle; + + // draw arc + if (m_custom_paint == CUSTOM_PAINT_CARLA_L) + { + startAngle = 216*16; + spanAngle = -252.0*16*value; + } + else if (m_custom_paint == CUSTOM_PAINT_CARLA_R) + { + startAngle = 324.0*16; + spanAngle = 252.0*16*(1.0-value); + } + else + return; + + painter.setPen(QPen(color, 2)); + painter.drawArc(3.5, 4.5, 22.0, 22.0, startAngle, spanAngle); + + if (HOVER_MIN < m_hover_step && m_hover_step < HOVER_MAX) + { + m_hover_step += m_hovered ? 1 : -1; + QTimer::singleShot(20, this, SLOT(update())); + } + } - if (HOVER_MIN > m_hover_step && m_hover_step < HOVER_MAX) + if (HOVER_MIN < m_hover_step && m_hover_step < HOVER_MAX) { m_hover_step += m_hovered ? 1 : -1; QTimer::singleShot(20, this, SLOT(update())); @@ -232,9 +313,8 @@ void PixmapDial::paintEvent(QPaintEvent*) } else { - target = QRectF(0.0, 0.0, p_size, p_size); - source = target; - painter.drawPixmap(target, m_pixmap, source); + QRectF target(0.0, 0.0, p_size, p_size); + painter.drawPixmap(target, m_pixmap, target); } } diff --git a/c++/widgets/pixmapdial.h b/c++/widgets/pixmapdial.h index 1cba105..3eb6f64 100644 --- a/c++/widgets/pixmapdial.h +++ b/c++/widgets/pixmapdial.h @@ -39,11 +39,11 @@ public: PixmapDial(QWidget* parent); - int getSize() const; + int getSize() const; void setCustomPaint(CustomPaint paint); void setEnabled(bool enabled); void setLabel(QString label); - void setPixmap(int pixmap_id); + void setPixmap(int pixmapId); QSize minimumSizeHint() const; QSize sizeHint() const; @@ -64,7 +64,7 @@ private: Orientation m_orientation; bool m_hovered; - int m_hover_step; + unsigned short m_hover_step; QString m_label; QPointF m_label_pos; @@ -80,8 +80,8 @@ private: int p_width, p_height, p_size, p_count; - static const int HOVER_MIN = 0; - static const int HOVER_MAX = 9; + static const unsigned short HOVER_MIN = 0; + static const unsigned short HOVER_MAX = 9; }; #endif // PIXMAPDIAL_H diff --git a/c++/xycontroller/xycontroller.cpp b/c++/xycontroller/xycontroller.cpp index 0c13e06..abe0a4b 100644 --- a/c++/xycontroller/xycontroller.cpp +++ b/c++/xycontroller/xycontroller.cpp @@ -60,11 +60,9 @@ private: //QMutex mutex; }; -qreal abs_q(const qreal value) +float abs_f(const float value) { - if (value < 1.0) - return -value; - return value; + return (value < 1.0f) ? -value : value; } #if 0 @@ -890,6 +888,10 @@ int main(int argc, char* argv[]) { MIDI_CC_LIST__init(); +#ifdef Q_OS_WIN + QApplication::setGraphicsSystem("raster"); +#endif + QApplication app(argc, argv); app.setApplicationName("XY-Controller"); app.setApplicationVersion(VERSION); diff --git a/src/digitalpeakmeter.py b/src/digitalpeakmeter.py index 28e9cb9..8393b27 100644 --- a/src/digitalpeakmeter.py +++ b/src/digitalpeakmeter.py @@ -54,7 +54,7 @@ class DigitalPeakMeter(QWidget): if level < 0.0: level = -level - else if level > 1.0: + elif level > 1.0: level = 1.0 self.m_channelsData[meter-1] = level diff --git a/src/pixmapdial.py b/src/pixmapdial.py index 6f1aefe..1e82260 100644 --- a/src/pixmapdial.py +++ b/src/pixmapdial.py @@ -17,14 +17,17 @@ # For a full copy of the GNU General Public License see the COPYING file # Imports (Global) +from math import floor from PyQt4.QtCore import Qt, QPointF, QRectF, QTimer, QSize, SLOT from PyQt4.QtGui import QColor, QConicalGradient, QDial, QFontMetrics, QLinearGradient, QPainter, QPainterPath, QPen, QPixmap # Widget Class class PixmapDial(QDial): + # enum Orientation HORIZONTAL = 0 VERTICAL = 1 + # enum CustomPaint CUSTOM_PAINT_NULL = 0 CUSTOM_PAINT_CARLA_WET = 1 CUSTOM_PAINT_CARLA_VOL = 2 @@ -89,25 +92,21 @@ class PixmapDial(QDial): self.m_label_width = QFontMetrics(self.font()).width(label) self.m_label_height = QFontMetrics(self.font()).height() - self.m_label_pos.setX((self.p_size / 2) - (self.m_label_width / 2)) + self.m_label_pos.setX(float(self.p_size)/2 - float(self.m_label_width)/2) self.m_label_pos.setY(self.p_size + self.m_label_height) self.m_label_gradient.setColorAt(0.0, self.m_color1) self.m_label_gradient.setColorAt(0.6, self.m_color1) self.m_label_gradient.setColorAt(1.0, self.m_color2) - self.m_label_gradient.setStart(0, self.p_size / 2) + self.m_label_gradient.setStart(0, float(self.p_size)/2) self.m_label_gradient.setFinalStop(0, self.p_size + self.m_label_height + 5) - self.m_label_gradient_rect = QRectF(self.p_size * 1 / 8, self.p_size / 2, self.p_size * 6 / 8, self.p_size + self.m_label_height + 5) + self.m_label_gradient_rect = QRectF(float(self.p_size)/8, float(self.p_size)/2, float(self.p_size)*6/8, self.p_size+self.m_label_height+5) self.update() - def setPixmap(self, pixmap_id): - if pixmap_id > 10: - self.m_pixmap_n_str = str(pixmap_id) - else: - self.m_pixmap_n_str = "0%i" % pixmap_id - + def setPixmap(self, pixmapId): + self.m_pixmap_n_str = "%02i" % pixmapId self.m_pixmap.load(":/bitmaps/dial_%s%s.png" % (self.m_pixmap_n_str, "" if self.isEnabled() else "d")) if self.m_pixmap.width() > self.m_pixmap.height(): @@ -135,10 +134,10 @@ class PixmapDial(QDial): self.p_height = 1 if self.m_orientation == self.HORIZONTAL: - self.p_size = self.p_height + self.p_size = self.p_height self.p_count = self.p_width / self.p_height else: - self.p_size = self.p_width + self.p_size = self.p_width self.p_count = self.p_height / self.p_width self.setMinimumSize(self.p_size, self.p_size + self.m_label_height + 5) @@ -146,14 +145,14 @@ class PixmapDial(QDial): def enterEvent(self, event): self.m_hovered = True - if self.m_hover_step == self.HOVER_MIN: - self.m_hover_step = self.HOVER_MIN + 1 + if self.m_hover_step == self.HOVER_MIN: + self.m_hover_step += 1 QDial.enterEvent(self, event) def leaveEvent(self, event): self.m_hovered = False - if self.m_hover_step == self.HOVER_MAX: - self.m_hover_step = self.HOVER_MAX - 1 + if self.m_hover_step == self.HOVER_MAX: + self.m_hover_step -= 1 QDial.leaveEvent(self, event) def paintEvent(self, event): @@ -165,7 +164,7 @@ class PixmapDial(QDial): painter.setBrush(self.m_label_gradient) painter.drawRect(self.m_label_gradient_rect) - painter.setPen(self.m_colorT[0] if self.isEnabled() else self.m_colorT[1]) + painter.setPen(self.m_colorT[0 if self.isEnabled() else 1]) painter.drawText(self.m_label_pos, self.m_label) if self.isEnabled(): @@ -175,8 +174,8 @@ class PixmapDial(QDial): if divider == 0.0: return - target = QRectF(0.0, 0.0, self.p_size, self.p_size) value = current / divider + target = QRectF(0.0, 0.0, self.p_size, self.p_size) per = int((self.p_count - 1) * value) @@ -196,20 +195,18 @@ class PixmapDial(QDial): colorGreen = QColor(0x5D, 0xE7, 0x3D, 191 + self.m_hover_step*7) colorBlue = QColor(0x3E, 0xB8, 0xBE, 191 + self.m_hover_step*7) - #colorGreen = QColor(0x5D + self.m_hover_step*6, 0xE7 + self.m_hover_step*1, 0x3D + self.m_hover_step*5) - #colorBlue = QColor(0x52 + self.m_hover_step*8, 0xEE + self.m_hover_step*1, 0xF8 + self.m_hover_step/2) - # draw small circle - ballPath = QPainterPath() ballRect = QRectF(8.0, 8.0, 15.0, 15.0) + ballPath = QPainterPath() ballPath.addEllipse(ballRect) #painter.drawRect(ballRect) - ballValue = (0.375 + 0.75*value) % 1.0 + tmpValue = (0.375 + 0.75*value) + ballValue = tmpValue - floor(tmpValue) ballPoint = ballPath.pointAtPercent(ballValue) # draw arc startAngle = 216*16 - spanAngle = -252.0*16*value + spanAngle = -252*16*value if self.m_custom_paint == self.CUSTOM_PAINT_CARLA_WET: painter.setBrush(colorBlue) @@ -242,11 +239,12 @@ class PixmapDial(QDial): color = QColor(0xAD + self.m_hover_step*5, 0xD5 + self.m_hover_step*4, 0x4B + self.m_hover_step*5) # draw small circle - ballPath = QPainterPath() ballRect = QRectF(7.0, 8.0, 11.0, 12.0) + ballPath = QPainterPath() ballPath.addEllipse(ballRect) #painter.drawRect(ballRect) - ballValue = (0.375 + 0.75*value) % 1.0 + tmpValue = (0.375 + 0.75*value) + ballValue = tmpValue - floor(tmpValue) ballPoint = ballPath.pointAtPercent(ballValue) painter.setBrush(color) @@ -272,8 +270,7 @@ class PixmapDial(QDial): else: target = QRectF(0.0, 0.0, self.p_size, self.p_size) - source = target - painter.drawPixmap(target, self.m_pixmap, source) + painter.drawPixmap(target, self.m_pixmap, target) def resizeEvent(self, event): self.updateSizes()