@@ -1,14 +1,27 @@ | |||
#!/usr/bin/make -f | |||
# Makefile for widgets # | |||
# -------------------- # | |||
# Makefile for carla-widgets # | |||
# -------------------------- # | |||
# Created by falkTX | |||
# | |||
include ../../Makefile.mk | |||
CWD=.. | |||
include $(CWD)/Makefile.mk | |||
# -------------------------------------------------------------- | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -I. -I.. -I../../includes -I../../utils | |||
BINDIR := $(CWD)/../bin | |||
ifeq ($(DEBUG),true) | |||
OBJDIR := $(CWD)/../build/widgets/Debug | |||
MODULEDIR := $(CWD)/../build/modules/Debug | |||
else | |||
OBJDIR := $(CWD)/../build/widgets/Release | |||
MODULEDIR := $(CWD)/../build/modules/Release | |||
endif | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -I. -I$(CWD)/includes -I$(CWD)/modules -I$(CWD)/utils | |||
ifeq ($(HAVE_QT4),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
@@ -18,50 +31,57 @@ BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
endif | |||
# -------------------------------------------------------------- | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
FILES = \ | |||
moc_paramspinbox.cpp \ | |||
moc_pixmapkeyboard.cpp | |||
# FILES = \ | |||
# moc_paramspinbox.cpp \ | |||
# moc_pixmapkeyboard.cpp | |||
OBJS = \ | |||
digitalpeakmeter.cpp.o \ | |||
ledbutton.cpp.o \ | |||
paramspinbox.cpp.o \ | |||
pixmapdial.cpp.o \ | |||
pixmapkeyboard.cpp.o | |||
$(OBJDIR)/digitalpeakmeter.cpp.o | |||
OBJS += \ | |||
moc_paramspinbox.cpp.o \ | |||
moc_pixmapkeyboard.cpp.o | |||
# ledbutton.cpp.o \ | |||
# paramspinbox.cpp.o \ | |||
# pixmapdial.cpp.o \ | |||
# pixmapkeyboard.cpp.o | |||
# -------------------------------------------------------------- | |||
# OBJS += \ | |||
# moc_paramspinbox.cpp.o \ | |||
# moc_pixmapkeyboard.cpp.o | |||
all: ../widgets.a | |||
TARGET = $(MODULEDIR)/widgets.a | |||
# -------------------------------------------------------------- | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
../widgets.a: $(FILES) $(OBJS) | |||
$(RM) $@ | |||
$(AR) crs $@ $(OBJS) | |||
all: $(TARGET) | |||
# -------------------------------------------------------------- | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
%.cpp.o: %.cpp %.hpp | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
clean: | |||
rm -f $(OBJDIR)/*.o $(TARGET) | |||
debug: | |||
$(MAKE) DEBUG=true | |||
moc_%.cpp.o: %.cpp | |||
$(CXX) moc_$< $(BUILD_CXX_FLAGS) -c -o $@ | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
moc_%.cpp: %.hpp | |||
$(MOC) $< -o $@ | |||
$(MODULEDIR)/widgets.a: $(FILES) $(OBJS) | |||
$(RM) $@ | |||
$(AR) crs $@ $(OBJS) | |||
# -------------------------------------------------------------- | |||
# ---------------------------------------------------------------------------------------------------------------------------- | |||
clean: | |||
$(RM) *.o ../widgets*.a $(FILES) | |||
$(OBJDIR)/%.cpp.o: %.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling $<" | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
debug: | |||
$(MAKE) DEBUG=true | |||
-include $(OBJS:%.o=%.d) | |||
# moc_%.cpp.o: %.cpp | |||
# $(CXX) moc_$< $(BUILD_CXX_FLAGS) -c -o $@ | |||
# | |||
# moc_%.cpp: %.hpp | |||
# $(MOC) $< -o $@ | |||
# -------------------------------------------------------------- | |||
# ---------------------------------------------------------------------------------------------------------------------------- |
@@ -1,6 +1,6 @@ | |||
/* | |||
* Digital Peak Meter, a custom Qt4 widget | |||
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||
* Digital Peak Meter, a custom Qt widget | |||
* Copyright (C) 2011-2015 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
@@ -16,273 +16,3 @@ | |||
*/ | |||
#include "digitalpeakmeter.hpp" | |||
#include <QtGui/QPainter> | |||
#include <QtGui/QPaintEvent> | |||
DigitalPeakMeter::DigitalPeakMeter(QWidget* parent) | |||
: QWidget(parent), | |||
fChannels(0), | |||
fSmoothMultiplier(1), | |||
fWidth(0), | |||
fHeight(0), | |||
fSizeMeter(0), | |||
fOrientation(VERTICAL), | |||
fColorBackground("#111111"), | |||
fGradientMeter(0, 0, 1, 1), | |||
fColorBase(93, 231, 61), | |||
fColorBaseAlt(15, 110, 15, 100), | |||
fChannelsData(nullptr), | |||
fLastValueData(nullptr) | |||
{ | |||
setChannels(0); | |||
setColor(GREEN); | |||
} | |||
DigitalPeakMeter::~DigitalPeakMeter() | |||
{ | |||
if (fChannelsData != nullptr) | |||
delete[] fChannelsData; | |||
if (fLastValueData != nullptr) | |||
delete[] fLastValueData; | |||
} | |||
void DigitalPeakMeter::displayMeter(int meter, float level) | |||
{ | |||
Q_ASSERT(fChannelsData != nullptr); | |||
Q_ASSERT(meter > 0 && meter <= fChannels); | |||
if (meter <= 0 || meter > fChannels || fChannelsData == nullptr) | |||
return qCritical("DigitalPeakMeter::displayMeter(%i, %f) - invalid meter number", meter, level); | |||
int i = meter - 1; | |||
if (fSmoothMultiplier > 0) | |||
level = (fLastValueData[i] * fSmoothMultiplier + level) / float(fSmoothMultiplier + 1); | |||
if (level < 0.001f) | |||
level = 0.0f; | |||
else if (level > 0.999f) | |||
level = 1.0f; | |||
if (fChannelsData[i] != level) | |||
{ | |||
fChannelsData[i] = level; | |||
update(); | |||
} | |||
fLastValueData[i] = level; | |||
} | |||
void DigitalPeakMeter::setChannels(int channels) | |||
{ | |||
Q_ASSERT(channels >= 0); | |||
if (channels < 0) | |||
return qCritical("DigitalPeakMeter::setChannels(%i) - 'channels' must be a positive integer", channels); | |||
fChannels = channels; | |||
if (fChannelsData != nullptr) | |||
delete[] fChannelsData; | |||
if (fLastValueData != nullptr) | |||
delete[] fLastValueData; | |||
if (channels > 0) | |||
{ | |||
fChannelsData = new float[channels]; | |||
fLastValueData = new float[channels]; | |||
for (int i=0; i < channels; ++i) | |||
{ | |||
fChannelsData[i] = 0.0f; | |||
fLastValueData[i] = 0.0f; | |||
} | |||
} | |||
else | |||
{ | |||
fChannelsData = nullptr; | |||
fLastValueData = nullptr; | |||
} | |||
} | |||
void DigitalPeakMeter::setColor(Color color) | |||
{ | |||
if (color == GREEN) | |||
{ | |||
fColorBase = QColor(93, 231, 61); | |||
fColorBaseAlt = QColor(15, 110, 15, 100); | |||
} | |||
else if (color == BLUE) | |||
{ | |||
fColorBase = QColor(82, 238, 248); | |||
fColorBaseAlt = QColor(15, 15, 110, 100); | |||
} | |||
else | |||
return qCritical("DigitalPeakMeter::setColor(%i) - invalid color", color); | |||
setOrientation(fOrientation); | |||
} | |||
void DigitalPeakMeter::setOrientation(Orientation orientation) | |||
{ | |||
fOrientation = orientation; | |||
if (fOrientation == HORIZONTAL) | |||
{ | |||
fGradientMeter.setColorAt(0.0f, fColorBase); | |||
fGradientMeter.setColorAt(0.2f, fColorBase); | |||
fGradientMeter.setColorAt(0.4f, fColorBase); | |||
fGradientMeter.setColorAt(0.6f, fColorBase); | |||
fGradientMeter.setColorAt(0.8f, Qt::yellow); | |||
fGradientMeter.setColorAt(1.0f, Qt::red); | |||
} | |||
else if (fOrientation == VERTICAL) | |||
{ | |||
fGradientMeter.setColorAt(0.0f, Qt::red); | |||
fGradientMeter.setColorAt(0.2f, Qt::yellow); | |||
fGradientMeter.setColorAt(0.4f, fColorBase); | |||
fGradientMeter.setColorAt(0.6f, fColorBase); | |||
fGradientMeter.setColorAt(0.8f, fColorBase); | |||
fGradientMeter.setColorAt(1.0f, fColorBase); | |||
} | |||
else | |||
return qCritical("DigitalPeakMeter::setOrientation(%i) - invalid orientation", orientation); | |||
updateSizes(); | |||
} | |||
void DigitalPeakMeter::setSmoothRelease(int value) | |||
{ | |||
Q_ASSERT(value >= 0 && value <= 5); | |||
if (value < 0) | |||
value = 0; | |||
else if (value > 5) | |||
value = 5; | |||
fSmoothMultiplier = value; | |||
} | |||
QSize DigitalPeakMeter::minimumSizeHint() const | |||
{ | |||
return QSize(10, 10); | |||
} | |||
QSize DigitalPeakMeter::sizeHint() const | |||
{ | |||
return QSize(fWidth, fHeight); | |||
} | |||
void DigitalPeakMeter::updateSizes() | |||
{ | |||
fWidth = width(); | |||
fHeight = height(); | |||
fSizeMeter = 0; | |||
if (fOrientation == HORIZONTAL) | |||
{ | |||
fGradientMeter.setFinalStop(fWidth, 0); | |||
if (fChannels > 0) | |||
fSizeMeter = fHeight/fChannels; | |||
} | |||
else if (fOrientation == VERTICAL) | |||
{ | |||
fGradientMeter.setFinalStop(0, fHeight); | |||
if (fChannels > 0) | |||
fSizeMeter = fWidth/fChannels; | |||
} | |||
} | |||
void DigitalPeakMeter::paintEvent(QPaintEvent* event) | |||
{ | |||
QPainter painter(this); | |||
event->accept(); | |||
painter.setPen(Qt::black); | |||
painter.setBrush(Qt::black); | |||
painter.drawRect(0, 0, fWidth, fHeight); | |||
int meterX = 0; | |||
painter.setPen(fColorBackground); | |||
painter.setBrush(fGradientMeter); | |||
for (int i=0; i < fChannels; ++i) | |||
{ | |||
float value, level = fChannelsData[i]; | |||
if (fOrientation == HORIZONTAL) | |||
value = level * float(fWidth); | |||
else if (fOrientation == VERTICAL) | |||
value = float(fHeight) - (level * float(fHeight)); | |||
else | |||
value = 0.0f; | |||
if (fOrientation == HORIZONTAL) | |||
painter.drawRect(0, meterX, int(value), fSizeMeter); | |||
else if (fOrientation == VERTICAL) | |||
painter.drawRect(meterX, int(value), fSizeMeter, fHeight); | |||
meterX += fSizeMeter; | |||
} | |||
painter.setBrush(Qt::black); | |||
if (fOrientation == HORIZONTAL) | |||
{ | |||
// Variables | |||
float lsmall = fWidth; | |||
float lfull = fHeight - 1; | |||
// Base | |||
painter.setPen(fColorBaseAlt); | |||
painter.drawLine(lsmall * 0.25f, 2, lsmall * 0.25f, lfull-2.0f); | |||
painter.drawLine(lsmall * 0.50f, 2, lsmall * 0.50f, lfull-2.0f); | |||
// Yellow | |||
painter.setPen(QColor(110, 110, 15, 100)); | |||
painter.drawLine(lsmall * 0.70f, 2, lsmall * 0.70f, lfull-2.0f); | |||
painter.drawLine(lsmall * 0.83f, 2, lsmall * 0.83f, lfull-2.0f); | |||
// Orange | |||
painter.setPen(QColor(180, 110, 15, 100)); | |||
painter.drawLine(lsmall * 0.90f, 2, lsmall * 0.90f, lfull-2.0f); | |||
// Red | |||
painter.setPen(QColor(110, 15, 15, 100)); | |||
painter.drawLine(lsmall * 0.96f, 2, lsmall * 0.96f, lfull-2.0f); | |||
} | |||
else if (fOrientation == VERTICAL) | |||
{ | |||
// Variables | |||
float lsmall = fHeight; | |||
float lfull = fWidth - 1; | |||
// Base | |||
painter.setPen(fColorBaseAlt); | |||
painter.drawLine(2, lsmall - (lsmall * 0.25f), lfull-2.0f, lsmall - (lsmall * 0.25f)); | |||
painter.drawLine(2, lsmall - (lsmall * 0.50f), lfull-2.0f, lsmall - (lsmall * 0.50f)); | |||
// Yellow | |||
painter.setPen(QColor(110, 110, 15, 100)); | |||
painter.drawLine(2, lsmall - (lsmall * 0.70f), lfull-2.0f, lsmall - (lsmall * 0.70f)); | |||
painter.drawLine(2, lsmall - (lsmall * 0.83f), lfull-2.0f, lsmall - (lsmall * 0.83f)); | |||
// Orange | |||
painter.setPen(QColor(180, 110, 15, 100)); | |||
painter.drawLine(2, lsmall - (lsmall * 0.90f), lfull-2.0f, lsmall - (lsmall * 0.90f)); | |||
// Red | |||
painter.setPen(QColor(110, 15, 15, 100)); | |||
painter.drawLine(2, lsmall - (lsmall * 0.96f), lfull-2.0f, lsmall - (lsmall * 0.96f)); | |||
} | |||
} | |||
void DigitalPeakMeter::resizeEvent(QResizeEvent* event) | |||
{ | |||
updateSizes(); | |||
QWidget::resizeEvent(event); | |||
} |
@@ -1,6 +1,6 @@ | |||
/* | |||
* Digital Peak Meter, a custom Qt4 widget | |||
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||
* Digital Peak Meter, a custom Qt widget | |||
* Copyright (C) 2011-2015 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
@@ -20,7 +20,8 @@ | |||
#include "CarlaJuceUtils.hpp" | |||
#include <QtCore/QTimer> | |||
#include <QtGui/QPainter> | |||
#include <QtGui/QPaintEvent> | |||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) | |||
# include <QtWidgets/QWidget> | |||
@@ -28,53 +29,345 @@ | |||
# include <QtGui/QWidget> | |||
#endif | |||
// ------------------------------------------------------------------------------------------------------------ | |||
class DigitalPeakMeter : public QWidget | |||
{ | |||
public: | |||
enum Color { | |||
COLOR_GREEN = 1, | |||
COLOR_BLUE = 2 | |||
}; | |||
enum Orientation { | |||
HORIZONTAL = 1, | |||
VERTICAL = 2 | |||
}; | |||
enum Color { | |||
GREEN = 1, | |||
BLUE = 2 | |||
enum Style { | |||
STYLE_DEFAULT = 1, | |||
STYLE_OPENAV = 2, | |||
STYLE_RNCBC = 3 | |||
}; | |||
DigitalPeakMeter(QWidget* parent); | |||
~DigitalPeakMeter() override; | |||
// -------------------------------------------------------------------------------------------------------- | |||
DigitalPeakMeter(QWidget* const p) | |||
: QWidget(p), | |||
fChannelCount(0), | |||
fChannelData(nullptr), | |||
fLastChannelData(nullptr), | |||
fMeterColor(COLOR_GREEN), | |||
fMeterColorBase(93, 231, 61), | |||
fMeterColorBaseAlt(15, 110, 15, 100), | |||
fMeterLinesEnabled(true), | |||
fMeterOrientation(VERTICAL), | |||
fMeterStyle(STYLE_DEFAULT), | |||
fMeterBackground("#111111"), | |||
fMeterGradient(0, 0, 0, 0), | |||
fSmoothMultiplier(1), | |||
leakDetector_DigitalPeakMeter() | |||
{ | |||
updateGrandient(); | |||
} | |||
~DigitalPeakMeter() override | |||
{ | |||
if (fChannelData != nullptr) | |||
{ | |||
delete[] fChannelData; | |||
fChannelData = nullptr; | |||
} | |||
if (fLastChannelData != nullptr) | |||
{ | |||
delete[] fLastChannelData; | |||
fLastChannelData = nullptr; | |||
} | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
int channelCount() const noexcept | |||
{ | |||
return fChannelCount; | |||
} | |||
void setChannelCount(const int count) | |||
{ | |||
if (fChannelCount == count) | |||
return; | |||
if (count < 0) | |||
return qCritical("DigitalPeakMeter::setChannelCount(%i) - channel count must be a positive integer or zero", count); | |||
fChannelCount = count; | |||
fChannelData = new float[count]; | |||
fLastChannelData = new float[count]; | |||
for (int i=count; --i >= 0;) | |||
{ | |||
/**/fChannelData[i] = 0.0f; | |||
fLastChannelData[i] = 0.0f; | |||
} | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
Color meterColor() const noexcept | |||
{ | |||
return fMeterColor; | |||
} | |||
void setMeterColor(const Color color) | |||
{ | |||
if (fMeterColor == color) | |||
return; | |||
if (! QList<Color>({COLOR_GREEN, COLOR_BLUE}).contains(color)) | |||
return qCritical("DigitalPeakMeter::setMeterColor(%i) - invalid color", color); | |||
switch (color) | |||
{ | |||
case COLOR_GREEN: | |||
fMeterColorBase = QColor(93, 231, 61); | |||
fMeterColorBaseAlt = QColor(15, 110, 15, 100); | |||
break; | |||
case COLOR_BLUE: | |||
fMeterColorBase = QColor(82, 238, 248); | |||
fMeterColorBaseAlt = QColor(15, 15, 110, 100); | |||
break; | |||
} | |||
fMeterColor = color; | |||
updateGrandient(); | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
bool meterLinesEnabled() const noexcept | |||
{ | |||
return fMeterLinesEnabled; | |||
} | |||
void setMeterLinesEnabled(const bool yesNo) | |||
{ | |||
if (fMeterLinesEnabled == yesNo) | |||
return; | |||
fMeterLinesEnabled = yesNo; | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
Orientation meterOrientation() const noexcept | |||
{ | |||
return fMeterOrientation; | |||
} | |||
void setMeterOrientation(const Orientation orientation) | |||
{ | |||
if (fMeterOrientation == orientation) | |||
return; | |||
if (! QList<Orientation>({HORIZONTAL, VERTICAL}).contains(orientation)) | |||
return qCritical("DigitalPeakMeter::setMeterOrientation(%i) - invalid orientation", orientation); | |||
fMeterOrientation = orientation; | |||
updateGrandient(); | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
Style meterStyle() const noexcept | |||
{ | |||
return fMeterStyle; | |||
} | |||
void displayMeter(int meter, float level); | |||
void setChannels(int channels); | |||
void setColor(Color color); | |||
void setOrientation(Orientation orientation); | |||
void setSmoothRelease(int value); | |||
void setMeterStyle(const Style style) | |||
{ | |||
if (fMeterStyle == style) | |||
return; | |||
QSize minimumSizeHint() const override; | |||
QSize sizeHint() const override; | |||
if (! QList<Style>({STYLE_DEFAULT, STYLE_OPENAV, STYLE_RNCBC}).contains(style)) | |||
return qCritical("DigitalPeakMeter::setMeterStyle(%i) - invalid style", style); | |||
switch (style) | |||
{ | |||
case STYLE_DEFAULT: | |||
fMeterBackground = QColor("#111111"); | |||
break; | |||
case STYLE_OPENAV: | |||
fMeterBackground = QColor("#1A1A1A"); | |||
break; | |||
case STYLE_RNCBC: | |||
fMeterBackground = QColor("#111111"); | |||
break; | |||
} | |||
fMeterStyle = style; | |||
updateGrandient(); | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
int smoothMultiplier() const noexcept | |||
{ | |||
return fSmoothMultiplier; | |||
} | |||
void setSmoothMultiplier(const int value) | |||
{ | |||
if (fSmoothMultiplier == value) | |||
return; | |||
if (value < 0) | |||
return qCritical("DigitalPeakMeter::setSmoothMultiplier(%i) - value must be >= 0", value); | |||
if (value > 5) | |||
return qCritical("DigitalPeakMeter::setSmoothMultiplier(%i) - value must be < 5", value); | |||
fSmoothMultiplier = value; | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
void displayMeter(const int meter, float level, bool forced = false) | |||
{ | |||
if (meter <= 0 or meter > fChannelCount) | |||
return qCritical("DigitalPeakMeter::displayMeter(%i, %f) - invalid meter number", meter, level); | |||
const int i = meter - 1; | |||
if (fSmoothMultiplier > 0 && ! forced) | |||
level = (fLastChannelData[i] * float(fSmoothMultiplier) + level) / float(fSmoothMultiplier + 1); | |||
if (level < 0.001f) | |||
level = 0.0f; | |||
else if (level > 0.999f) | |||
level = 1.0f; | |||
if (fChannelData[i] != level) | |||
{ | |||
fChannelData[i] = level; | |||
update(); | |||
} | |||
fLastChannelData[i] = level; | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
protected: | |||
void updateSizes(); | |||
void updateGrandient() | |||
{ | |||
fMeterGradient = QLinearGradient(0, 0, 1, 1); | |||
void paintEvent(QPaintEvent* event) override; | |||
void resizeEvent(QResizeEvent* event) override; | |||
if (fMeterStyle == STYLE_OPENAV) | |||
{ | |||
fMeterGradient.setColorAt(0.0, fMeterColorBase); | |||
fMeterGradient.setColorAt(1.0, fMeterColorBase); | |||
} | |||
else | |||
{ | |||
switch (fMeterOrientation) | |||
{ | |||
case HORIZONTAL: | |||
fMeterGradient.setColorAt(0.0, fMeterColorBase); | |||
fMeterGradient.setColorAt(0.2, fMeterColorBase); | |||
fMeterGradient.setColorAt(0.4, fMeterColorBase); | |||
fMeterGradient.setColorAt(0.6, fMeterColorBase); | |||
fMeterGradient.setColorAt(0.8, Qt::yellow); | |||
fMeterGradient.setColorAt(1.0, Qt::red); | |||
break; | |||
case VERTICAL: | |||
fMeterGradient.setColorAt(0.0, Qt::red); | |||
fMeterGradient.setColorAt(0.2, Qt::yellow); | |||
fMeterGradient.setColorAt(0.4, fMeterColorBase); | |||
fMeterGradient.setColorAt(0.6, fMeterColorBase); | |||
fMeterGradient.setColorAt(0.8, fMeterColorBase); | |||
fMeterGradient.setColorAt(1.0, fMeterColorBase); | |||
break; | |||
} | |||
} | |||
updateGrandientFinalStop(); | |||
} | |||
void updateGrandientFinalStop() | |||
{ | |||
switch (fMeterOrientation) | |||
{ | |||
case HORIZONTAL: | |||
fMeterGradient.setFinalStop(width(), 0); | |||
break; | |||
case VERTICAL: | |||
fMeterGradient.setFinalStop(0, height()); | |||
break; | |||
} | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
QSize minimumSizeHint() const override | |||
{ | |||
return QSize(10, 10); | |||
} | |||
QSize sizeHint() const override | |||
{ | |||
return QSize(width(), height()); | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
void paintEvent(QPaintEvent* const ev) override | |||
{ | |||
QPainter painter(this); | |||
ev->accept(); | |||
const int width_ = width(); | |||
const int height_ = height(); | |||
// draw background | |||
painter.setPen(QPen(fMeterBackground, 2)); | |||
painter.setBrush(fMeterBackground); | |||
painter.drawRect(0, 0, width_, height_); | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
void resizeEvent(QResizeEvent* const ev) override | |||
{ | |||
QWidget::resizeEvent(ev); | |||
updateGrandientFinalStop(); | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
private: | |||
int fChannels; | |||
int fSmoothMultiplier; | |||
int fWidth, fHeight, fSizeMeter; | |||
Orientation fOrientation; | |||
int fChannelCount; | |||
float* fChannelData; | |||
float* fLastChannelData; | |||
Color fMeterColor; | |||
QColor fMeterColorBase; | |||
QColor fMeterColorBaseAlt; | |||
QColor fColorBackground; | |||
QLinearGradient fGradientMeter; | |||
bool fMeterLinesEnabled; | |||
Orientation fMeterOrientation; | |||
Style fMeterStyle; | |||
QColor fColorBase; | |||
QColor fColorBaseAlt; | |||
QColor fMeterBackground; | |||
QLinearGradient fMeterGradient; | |||
float* fChannelsData; | |||
float* fLastValueData; | |||
int fSmoothMultiplier; | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DigitalPeakMeter) | |||
}; | |||
// ------------------------------------------------------------------------------------------------------------ | |||
#endif // DIGITALPEAKMETER_HPP_INCLUDED |
@@ -26,11 +26,11 @@ from carla_config import * | |||
if config_UseQt5: | |||
from PyQt5.QtCore import qCritical, Qt, QTimer, QSize | |||
from PyQt5.QtGui import QColor, QLinearGradient, QPainter | |||
from PyQt5.QtGui import QColor, QLinearGradient, QPainter, QPen | |||
from PyQt5.QtWidgets import QWidget | |||
else: | |||
from PyQt4.QtCore import qCritical, Qt, QTimer, QSize | |||
from PyQt4.QtGui import QColor, QLinearGradient, QPainter, QWidget | |||
from PyQt4.QtGui import QColor, QLinearGradient, QPainter, QPen, QWidget | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Widget Class | |||
@@ -49,6 +49,8 @@ class DigitalPeakMeter(QWidget): | |||
STYLE_OPENAV = 2 | |||
STYLE_RNCBC = 3 | |||
# -------------------------------------------------------------------------------------------------------- | |||
def __init__(self, parent): | |||
QWidget.__init__(self, parent) | |||
@@ -105,8 +107,6 @@ class DigitalPeakMeter(QWidget): | |||
if color not in (self.COLOR_GREEN, self.COLOR_BLUE): | |||
return qCritical("DigitalPeakMeter::setMeterColor(%i) - invalid color" % color) | |||
self.fMeterColor = color | |||
if color == self.COLOR_GREEN: | |||
self.fMeterColorBase = QColor(93, 231, 61) | |||
self.fMeterColorBaseAlt = QColor(15, 110, 15, 100) | |||
@@ -114,6 +114,8 @@ class DigitalPeakMeter(QWidget): | |||
self.fMeterColorBase = QColor(82, 238, 248) | |||
self.fMeterColorBaseAlt = QColor(15, 15, 110, 100) | |||
self.fMeterColor = color | |||
self.updateGrandient() | |||
# -------------------------------------------------------------------------------------------------------- | |||
@@ -155,8 +157,6 @@ class DigitalPeakMeter(QWidget): | |||
if style not in (self.STYLE_DEFAULT, self.STYLE_OPENAV, self.STYLE_RNCBC): | |||
return qCritical("DigitalPeakMeter::setMeterStyle(%i) - invalid style" % style) | |||
self.fMeterStyle = style | |||
if style == self.STYLE_DEFAULT: | |||
self.fMeterBackground = QColor("#111111") | |||
elif style == self.STYLE_OPENAV: | |||
@@ -164,6 +164,8 @@ class DigitalPeakMeter(QWidget): | |||
elif style == self.STYLE_RNCBC: | |||
self.fMeterBackground = QColor("#111111") | |||
self.fMeterStyle = style | |||
self.updateGrandient() | |||
# -------------------------------------------------------------------------------------------------------- | |||
@@ -219,21 +221,22 @@ class DigitalPeakMeter(QWidget): | |||
self.fMeterGradient.setColorAt(0.0, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(1.0, self.fMeterColorBase) | |||
elif self.fMeterOrientation == self.HORIZONTAL: | |||
self.fMeterGradient.setColorAt(0.0, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.2, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.4, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.6, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.8, Qt.yellow) | |||
self.fMeterGradient.setColorAt(1.0, Qt.red) | |||
else: | |||
if self.fMeterOrientation == self.HORIZONTAL: | |||
self.fMeterGradient.setColorAt(0.0, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.2, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.4, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.6, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.8, Qt.yellow) | |||
self.fMeterGradient.setColorAt(1.0, Qt.red) | |||
elif self.fMeterOrientation == self.VERTICAL: | |||
self.fMeterGradient.setColorAt(0.0, Qt.red) | |||
self.fMeterGradient.setColorAt(0.2, Qt.yellow) | |||
self.fMeterGradient.setColorAt(0.4, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.6, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.8, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(1.0, self.fMeterColorBase) | |||
elif self.fMeterOrientation == self.VERTICAL: | |||
self.fMeterGradient.setColorAt(0.0, Qt.red) | |||
self.fMeterGradient.setColorAt(0.2, Qt.yellow) | |||
self.fMeterGradient.setColorAt(0.4, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.6, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(0.8, self.fMeterColorBase) | |||
self.fMeterGradient.setColorAt(1.0, self.fMeterColorBase) | |||
self.updateGrandientFinalStop() | |||
@@ -261,20 +264,19 @@ class DigitalPeakMeter(QWidget): | |||
width = self.width() | |||
height = self.height() | |||
if self.fMeterStyle == self.STYLE_OPENAV: | |||
painter.setPen(QColor("#1A1A1A")) | |||
painter.setBrush(QColor("#1A1A1A")) | |||
else: | |||
painter.setPen(Qt.black) | |||
painter.setBrush(Qt.black) | |||
# draw background | |||
painter.setPen(QPen(self.fMeterBackground, 2)) | |||
painter.setBrush(self.fMeterBackground) | |||
painter.drawRect(0, 0, width, height) | |||
return | |||
meterX = 0 | |||
startX = -1 if self.fMeterStyle == self.STYLE_OPENAV else 0 | |||
padding = 2 if self.fMeterStyle == self.STYLE_OPENAV else 0 | |||
startX = 0 | |||
padding = 0 | |||
#startX = -1 if self.fMeterStyle == self.STYLE_OPENAV else 0 | |||
#padding = 2 if self.fMeterStyle == self.STYLE_OPENAV else 0 | |||
painter.setPen(self.fMeterBackground) # FIXME ? | |||
painter.setPen(QPen(self.fMeterBackground, 0)) | |||
painter.setBrush(self.fMeterGradient) | |||
#if self.fMeterStyle == self.STYLE_OPENAV: | |||
@@ -285,7 +287,7 @@ class DigitalPeakMeter(QWidget): | |||
#del color | |||
for i in range(self.fChannelCount): | |||
level = self.fChannelsData[i] | |||
level = self.fChannelData[i] | |||
if self.fMeterOrientation == self.HORIZONTAL: | |||
value = level * float(width) | |||
@@ -299,17 +301,17 @@ class DigitalPeakMeter(QWidget): | |||
elif self.fMeterOrientation == self.VERTICAL: | |||
painter.drawRect(meterX, int(value), self.fSizeMeter, self.fHeight) | |||
meterX += self.fSizeMeter | |||
meterX += self.fMeterSize | |||
if not self.fDrawLines: | |||
if not self.fMeterLinesEnabled: | |||
return | |||
painter.setBrush(Qt.black) | |||
if self.fOrientation == self.HORIZONTAL: | |||
if self.fMeterOrientation == self.HORIZONTAL: | |||
# Variables | |||
lsmall = float(self.fWidth) | |||
lfull = float(self.fHeight - 1) | |||
lsmall = float(width) | |||
lfull = float(height - 1) | |||
if self.fMeterStyle == self.STYLE_OPENAV: | |||
painter.setPen(QColor(37, 37, 37, 100)) | |||
@@ -317,12 +319,12 @@ class DigitalPeakMeter(QWidget): | |||
painter.drawLine(lsmall * 0.50, 2, lsmall * 0.50, lfull-2.0) | |||
painter.drawLine(lsmall * 0.75, 2, lsmall * 0.75, lfull-2.0) | |||
if self.fChannels > 1: | |||
if self.fChannelCount > 1: | |||
painter.drawLine(1, lfull/2, lsmall-1, lfull/2) | |||
else: | |||
# Base | |||
painter.setPen(self.fColorBaseAlt) | |||
painter.setPen(self.fMeterColorBaseAlt) | |||
painter.drawLine(lsmall * 0.25, 2, lsmall * 0.25, lfull-2.0) | |||
painter.drawLine(lsmall * 0.50, 2, lsmall * 0.50, lfull-2.0) | |||
@@ -339,10 +341,10 @@ class DigitalPeakMeter(QWidget): | |||
painter.setPen(QColor(110, 15, 15, 100)) | |||
painter.drawLine(lsmall * 0.96, 2, lsmall * 0.96, lfull-2.0) | |||
elif self.fOrientation == self.VERTICAL: | |||
elif self.fMeterOrientation == self.VERTICAL: | |||
# Variables | |||
lsmall = float(self.fHeight) | |||
lfull = float(self.fWidth - 1) | |||
lsmall = float(height) | |||
lfull = float(width - 1) | |||
if self.fMeterStyle == self.STYLE_OPENAV: | |||
# TODO | |||
@@ -350,7 +352,7 @@ class DigitalPeakMeter(QWidget): | |||
else: | |||
# Base | |||
painter.setPen(self.fColorBaseAlt) | |||
painter.setPen(self.fMeterColorBaseAlt) | |||
painter.drawLine(2, lsmall - (lsmall * 0.25), lfull-2.0, lsmall - (lsmall * 0.25)) | |||
painter.drawLine(2, lsmall - (lsmall * 0.50), lfull-2.0, lsmall - (lsmall * 0.50)) | |||
@@ -370,8 +372,8 @@ class DigitalPeakMeter(QWidget): | |||
# -------------------------------------------------------------------------------------------------------- | |||
def resizeEvent(self, event): | |||
self.updateGrandientFinalStop() | |||
QWidget.resizeEvent(self, event) | |||
self.updateGrandientFinalStop() | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Main Testing | |||
@@ -394,3 +396,5 @@ if __name__ == '__main__': | |||
gui.show() | |||
sys.exit(app.exec_()) | |||
# ------------------------------------------------------------------------------------------------------------ |