summaryrefslogtreecommitdiff
path: root/muse2/muse/widgets
diff options
context:
space:
mode:
authorRobert Jonsson <spamatica@gmail.com>2011-04-27 18:41:35 +0000
committerRobert Jonsson <spamatica@gmail.com>2011-04-27 18:41:35 +0000
commitd8ac618f4dc9afd0731a9a3531d4641c9e7ea6fd (patch)
tree559d73385e4c65bc4bc23e9fe0617680cb2c5ed3 /muse2/muse/widgets
parent499ccec21dd2ac636fb019c98a902c351b4ec165 (diff)
feedback parameters
Diffstat (limited to 'muse2/muse/widgets')
-rw-r--r--muse2/muse/widgets/CMakeLists.txt8
-rw-r--r--muse2/muse/widgets/meter.cpp217
-rw-r--r--muse2/muse/widgets/meter.h49
-rw-r--r--muse2/muse/widgets/verticalmeter.cpp209
-rw-r--r--muse2/muse/widgets/verticalmeter.h43
5 files changed, 524 insertions, 2 deletions
diff --git a/muse2/muse/widgets/CMakeLists.txt b/muse2/muse/widgets/CMakeLists.txt
index e3921f70..261c27a2 100644
--- a/muse2/muse/widgets/CMakeLists.txt
+++ b/muse2/muse/widgets/CMakeLists.txt
@@ -42,6 +42,7 @@ QT4_WRAP_CPP (widget_mocs
intlabel.h
knob.h
lcombo.h
+ meter.h
metronome.h
midisyncimpl.h
mixdowndialog.h
@@ -75,7 +76,8 @@ QT4_WRAP_CPP (widget_mocs
# ttoolbar.h
ttoolbutton.h
velocity.h
- view.h
+ verticalmeter.h
+ view.h
vscale.h
visibletracks.h
)
@@ -137,6 +139,7 @@ file (GLOB widgets_source_files
intlabel.cpp
knob.cpp
lcombo.cpp
+ meter.cpp
metronome.cpp
midisyncimpl.cpp
mixdowndialog.cpp
@@ -174,7 +177,8 @@ file (GLOB widgets_source_files
ttoolbutton.cpp
utils.cpp
velocity.cpp
- view.cpp
+ verticalmeter.cpp
+ view.cpp
vscale.cpp
visibletracks.cpp
)
diff --git a/muse2/muse/widgets/meter.cpp b/muse2/muse/widgets/meter.cpp
new file mode 100644
index 00000000..6619d1dc
--- /dev/null
+++ b/muse2/muse/widgets/meter.cpp
@@ -0,0 +1,217 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: meter.cpp,v 1.4.2.2 2009/05/03 04:14:00 terminator356 Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <stdio.h>
+#include <cmath>
+
+#include <QMouseEvent>
+#include <QPainter>
+#include <QResizeEvent>
+
+#include "meter.h"
+#include "gconfig.h"
+#include "fastlog.h"
+
+//---------------------------------------------------------
+// Meter
+//---------------------------------------------------------
+
+Meter::Meter(QWidget* parent, MeterType type)
+ : QFrame(parent) //Qt::WNoAutoErase
+ {
+ setBackgroundRole(QPalette::NoRole);
+ setAttribute(Qt::WA_NoSystemBackground);
+ 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);
+
+ mtype = type;
+ overflow = false;
+ val = 0.0;
+ maxVal = 0.0;
+ minScale = mtype == DBMeter ? config.minMeter : 0.0; // min value in dB or int
+ maxScale = mtype == DBMeter ? 10.0 : 127.0;
+ yellowScale = -10;
+ redScale = 0;
+ setLineWidth(0);
+ setMidLineWidth(0);
+ }
+
+//---------------------------------------------------------
+// setVal
+//---------------------------------------------------------
+
+void Meter::setVal(double v, double max, bool ovl)
+ {
+ overflow = ovl;
+ bool ud = false;
+
+ if(mtype == DBMeter)
+ {
+ double minScaleLin = pow(10.0, minScale/20.0);
+ if((v >= minScaleLin && val != v) || val >= minScaleLin)
+ {
+ val = v;
+ ud = true;
+ }
+ }
+ else
+ {
+ if(val != v)
+ {
+ val = v;
+ ud = true;
+ }
+ }
+
+ if(maxVal != max)
+ {
+ maxVal = max;
+ ud = true;
+ }
+
+ if(ud)
+ update();
+ }
+//---------------------------------------------------------
+// resetPeaks
+// reset peak and overflow indicator
+//---------------------------------------------------------
+
+void Meter::resetPeaks()
+ {
+ maxVal = val;
+ overflow = val > 0.0;
+ update();
+ }
+
+//---------------------------------------------------------
+// setRange
+//---------------------------------------------------------
+
+void Meter::setRange(double min, double max)
+ {
+ minScale = min;
+ maxScale = max;
+ update();
+ }
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+
+void Meter::paintEvent(QPaintEvent* /*ev*/)
+ {
+ // TODO: Could make better use of event rectangle, for speed.
+
+ QPainter p(this);
+
+ double range = maxScale - minScale;
+
+ int fw = frameWidth();
+ int w = width() - 2*fw;
+ int h = height() - 2*fw;
+ int yv;
+
+ if(mtype == DBMeter)
+ yv = val == 0 ? h : int(((maxScale - (fast_log10(val) * 20.0)) * h)/range);
+ else
+ yv = val == 0 ? h : int(((maxScale - val) * h)/range);
+
+ if(yv > h) yv = h;
+
+ // Draw the red, green, and yellow sections.
+ drawVU(p, w, h, yv);
+
+ // Draw the peak white line.
+ int ymax;
+ if(mtype == DBMeter)
+ ymax = maxVal == 0 ? 0 : int(((maxScale - (fast_log10(maxVal) * 20.0)) * h)/range);
+ else
+ ymax = maxVal == 0 ? 0 : int(((maxScale - maxVal) * h)/range);
+ p.setPen(Qt::white);
+ p.drawLine(0, ymax, w, ymax);
+ }
+
+//---------------------------------------------------------
+// drawVU
+//---------------------------------------------------------
+
+void Meter::drawVU(QPainter& p, int w, int h, int yv)
+{
+ if(mtype == DBMeter)
+ {
+ double range = maxScale - minScale;
+ int y1 = int((maxScale - redScale) * h / range);
+ int y2 = int((maxScale - yellowScale) * h / range);
+
+ if(yv < y1)
+ {
+ // Red section:
+ p.fillRect(0, 0, w, yv, QBrush(0x8e0000)); // dark red
+ p.fillRect(0, yv, w, y1-yv, QBrush(0xff0000)); // light red
+
+ // Yellow section:
+ p.fillRect(0, y1, w, y2-y1, QBrush(0xffff00)); // light yellow
+
+ // Green section:
+ p.fillRect(0, y2, w, h-y2, QBrush(0x00ff00)); // light green
+ }
+ else
+ if(yv < y2)
+ {
+ // Red section:
+ p.fillRect(0, 0, w, y1, QBrush(0x8e0000)); // dark red
+
+ // Yellow section:
+ p.fillRect(0, y1, w, yv-y1, QBrush(0x8e8e00)); // dark yellow
+ p.fillRect(0, yv, w, y2-yv, QBrush(0xffff00)); // light yellow
+
+ // Green section:
+ p.fillRect(0, y2, w, h-y2, QBrush(0x00ff00)); // light green
+ }
+ else
+ //if(yv <= y3)
+ {
+ // Red section:
+ p.fillRect(0, 0, w, y1, QBrush(0x8e0000)); // dark red
+
+ // Yellow section:
+ p.fillRect(0, y1, w, y2-y1, QBrush(0x8e8e00)); // dark yellow
+
+ // Green section:
+ p.fillRect(0, y2, w, yv-y2, QBrush(0x007000)); // dark green
+ p.fillRect(0, yv, w, h-yv, QBrush(0x00ff00)); // light green
+ }
+ }
+ else
+ {
+ p.fillRect(0, 0, w, yv, QBrush(0x007000)); // dark green
+ p.fillRect(0, yv, w, h-yv, QBrush(0x00ff00)); // light green
+ }
+}
+
+//---------------------------------------------------------
+// resizeEvent
+//---------------------------------------------------------
+
+void Meter::resizeEvent(QResizeEvent* /*ev*/)
+ {
+
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void Meter::mousePressEvent(QMouseEvent*)
+ {
+ emit mousePress();
+ }
+
diff --git a/muse2/muse/widgets/meter.h b/muse2/muse/widgets/meter.h
new file mode 100644
index 00000000..2b816040
--- /dev/null
+++ b/muse2/muse/widgets/meter.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: meter.h,v 1.1.1.1.2.2 2009/05/03 04:14:00 terminator356 Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __METER_H__
+#define __METER_H__
+
+#include <QFrame>
+
+class QResizeEvent;
+class QMouseEvent;
+class QPainter;
+
+
+class Meter : public QFrame {
+ public:
+ enum MeterType {DBMeter, LinMeter};
+ private:
+ MeterType mtype;
+ bool overflow;
+ double val;
+ double maxVal;
+ double minScale, maxScale;
+ int yellowScale, redScale;
+
+ void drawVU(QPainter& p, int, int, int);
+
+ Q_OBJECT
+ void paintEvent(QPaintEvent*);
+ void resizeEvent(QResizeEvent*);
+ void mousePressEvent(QMouseEvent*);
+
+ public slots:
+ void resetPeaks();
+ void setVal(double, double, bool);
+
+ signals:
+ void mousePress();
+
+ public:
+ Meter(QWidget* parent, MeterType type = DBMeter);
+ void setRange(double min, double max);
+ };
+#endif
+
diff --git a/muse2/muse/widgets/verticalmeter.cpp b/muse2/muse/widgets/verticalmeter.cpp
new file mode 100644
index 00000000..ca846886
--- /dev/null
+++ b/muse2/muse/widgets/verticalmeter.cpp
@@ -0,0 +1,209 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: meter.cpp,v 1.4.2.2 2009/05/03 04:14:00 terminator356 Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <stdio.h>
+#include <cmath>
+
+#include <QMouseEvent>
+#include <QPainter>
+#include <QResizeEvent>
+
+#include "verticalmeter.h"
+#include "gconfig.h"
+#include "fastlog.h"
+
+//---------------------------------------------------------
+// VerticalMeter
+//---------------------------------------------------------
+
+VerticalMeter::VerticalMeter(QWidget* parent, MeterType type)
+ : Meter(parent, type) //Qt::WNoAutoErase
+ {
+ setBackgroundRole(QPalette::NoRole);
+ setAttribute(Qt::WA_NoSystemBackground);
+ 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);
+
+ mtype = type;
+ overflow = false;
+ val = 0.0;
+ maxVal = 0.0;
+ minScale = mtype == DBMeter ? config.minMeter : 0.0; // min value in dB or int
+ maxScale = mtype == DBMeter ? 10.0 : 127.0;
+ yellowScale = -10;
+ redScale = 0;
+ setLineWidth(0);
+ setMidLineWidth(0);
+ }
+
+
+//---------------------------------------------------------
+// setVal
+//---------------------------------------------------------
+
+void VerticalMeter::setVal(double v) //, double max, bool ovl)
+ {
+ //overflow = ovl;
+ bool ud = false;
+
+ if(mtype == DBMeter)
+ {
+ double minScaleLin = pow(10.0, minScale/20.0);
+ if((v >= minScaleLin && val != v) || val >= minScaleLin)
+ {
+ val = v;
+ ud = true;
+ }
+ }
+ else
+ {
+ if(val != v)
+ {
+ val = v;
+ ud = true;
+ }
+ }
+
+// if(maxVal != max)
+// {
+// maxVal = max;
+// ud = true;
+// }
+
+ if(ud)
+ update();
+ }
+//---------------------------------------------------------
+// resetPeaks
+// reset peak and overflow indicator
+//---------------------------------------------------------
+
+void VerticalMeter::resetPeaks()
+ {
+ maxVal = val;
+ overflow = val > 0.0;
+ update();
+ }
+
+//---------------------------------------------------------
+// setRange
+//---------------------------------------------------------
+
+void VerticalMeter::setRange(double min, double max)
+ {
+ minScale = min;
+ maxScale = max;
+ update();
+ }
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+
+void VerticalMeter::paintEvent(QPaintEvent* /*ev*/)
+ {
+ // TODO: Could make better use of event rectangle, for speed.
+
+ QPainter p(this);
+
+ double range = maxScale - minScale;
+
+ int fw = frameWidth();
+ int w = width() - 2*fw;
+ int h = height() - 2*fw;
+ int xv;
+
+
+ if(mtype == DBMeter)
+ xv = val == 0 ? w : int(((maxScale - (fast_log10(val) * 20.0)) * w)/range);
+ else
+ xv = val == 0 ? w : int(((maxScale - val) * w)/range);
+
+ if(xv > w) xv = w;
+
+ // Draw the red, green, and yellow sections.
+ 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);
+ p.setPen(Qt::white);
+ p.drawLine(xcenter, 0, xcenter, h);
+ }
+
+//---------------------------------------------------------
+// drawVU
+//---------------------------------------------------------
+
+void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv)
+{
+ if(mtype == DBMeter)
+ {
+ double range = maxScale - minScale;
+ int x1 = int((maxScale - redScale) * w / range);
+ int x2 = int((maxScale - yellowScale) * w / range);
+
+ if(xv < x1)
+ {
+ // Red section:
+ p.fillRect(0, 0, xv, h, QBrush(0x8e0000)); // dark red
+ p.fillRect(xv, 0, x1-xv, h, QBrush(0xff0000)); // light red
+
+ // Yellow section:
+ p.fillRect(x1, 0, x2-x1, h, QBrush(0xffff00)); // light yellow
+
+ // Green section:
+ p.fillRect(x2, 0, w-x2, h, QBrush(0x00ff00)); // light green
+ }
+ else
+ if(xv < x2)
+ {
+ // Red section:
+ p.fillRect(0, 0, x1, h, QBrush(0x8e0000)); // dark red
+
+ // Yellow section:
+ p.fillRect(x1, 0, xv-x1, h, QBrush(0x8e8e00)); // dark yellow
+ p.fillRect(xv, 0, x2-xv, h, QBrush(0xffff00)); // light yellow
+
+ // Green section:
+ p.fillRect(x2, 0, w-x2, h, QBrush(0x00ff00)); // light green
+ }
+ else
+ //if(yv <= y3)
+ {
+ // Red section:
+ p.fillRect(0, 0, x1, h, QBrush(0x8e0000)); // dark red
+
+ // Yellow section:
+ p.fillRect(x1, 0, x2-x1, h, QBrush(0x8e8e00)); // dark yellow
+
+ // Green section:
+ p.fillRect(x2, 0, xv-x2, h, QBrush(0x007000)); // dark green
+ p.fillRect(xv, 0, w-xv, h, QBrush(0x00ff00)); // light green
+ }
+ }
+ else
+ {
+ p.fillRect(0, 0, xv, h, QBrush(0x00ff00)); // dark green
+ p.fillRect(xv, 0, w-xv, h, QBrush(0x007000)); // light green
+ }
+}
+
+//---------------------------------------------------------
+// resizeEvent
+//---------------------------------------------------------
+
+void VerticalMeter::resizeEvent(QResizeEvent* /*ev*/)
+ {
+
+ }
diff --git a/muse2/muse/widgets/verticalmeter.h b/muse2/muse/widgets/verticalmeter.h
new file mode 100644
index 00000000..699be1e5
--- /dev/null
+++ b/muse2/muse/widgets/verticalmeter.h
@@ -0,0 +1,43 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: meter.h,v 1.1.1.1.2.2 2009/05/03 04:14:00 terminator356 Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __VERTICALMETER_H__
+#define __VERTICALMETER_H__
+
+#include <QFrame>
+#include "meter.h"
+
+class QResizeEvent;
+class QMouseEvent;
+class QPainter;
+
+class VerticalMeter : public Meter {
+ private:
+ MeterType mtype;
+ bool overflow;
+ double val;
+ double maxVal;
+ double minScale, maxScale;
+ int yellowScale, redScale;
+
+ void drawVU(QPainter& p, int, int, int);
+
+ Q_OBJECT
+ void paintEvent(QPaintEvent*);
+ void resizeEvent(QResizeEvent*);
+
+ public slots:
+ void resetPeaks();
+ void setVal(double);
+
+ public:
+ VerticalMeter(QWidget* parent, MeterType type = DBMeter);
+ void setRange(double min, double max);
+ };
+#endif
+