Files
raDIYo/swvolumewidget.cpp
2025-08-05 22:36:00 +02:00

168 lines
3.8 KiB
C++

/***************************************************************************
source::worx raDIYo
Copyright © 2020-2022 c.holzheuer
chris@sourceworx.org
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
***************************************************************************/
#include <QDebug>
#include <QPainter>
#include <QMouseEvent>
#include <QtGlobal>
#include <raDIYo.h>
#include <swvolumewidget.h>
/**
* @brief Standardkonstruktor. Block- und Balkenanzahl auf 32
* @see setNumblocks
* @see setNumBars
*/
SWVolumeWidget::SWVolumeWidget( QWidget* parent )
: SWBarWidget( parent )
{
setNumBlocks( 32 );
setNumBars( 32 );
}
/**
* @brief Wird aufgerufen, wenn das (externe) Dial gedreht wurde.
*
* Hier wird _ein_ Wert gesetzt, zum Beispiel Lautstärke, Bässe,
* Höhen etc.
*/
void SWVolumeWidget::onDialDeltaChanged( int delta )
{
// gültigkeit sicherstellen
int newval = _value + delta;
newval = qBound( _rangeFrom, newval, _rangeTo );
if( _value == newval )
return;
setValue( newval );
update();
}
/**
* @brief Teil der Maussteuerung.
* @param event
*/
void SWVolumeWidget::mousePressEvent( QMouseEvent* event )
{
if( event->button() == Qt::LeftButton )
_moving = true;
}
/**
* @brief Zieht bei gedrücktem Mousebutton die Lautstärke hoch bzw. runter
* @param event
*/
void SWVolumeWidget::mouseMoveEvent( QMouseEvent* event )
{
if( ( event->buttons() & Qt::LeftButton ) && _moving )
{
double newX = (double) _rangeTo * (double) event->pos().x() / ( rect().width() - _frameOffset );
int lstVal = _value;
_value = qRound( newX );
int delta = _value - lstVal;
if( !delta )
return;
update();
emit deltaChanged( delta > 0 ? 1 : -1 );
}
}
/**
* @brief Teil der Maussteuerung.
* @param event
*/
void SWVolumeWidget::mouseReleaseEvent( QMouseEvent* event )
{
if( event->button() == Qt::LeftButton && _moving )
_moving = false;
}
/**
* @brief Zeichnet das Balkendiagramm.
* @param event
*/
void SWVolumeWidget::paintEvent( QPaintEvent* event )
{
Q_UNUSED( event )
QPainter painter( this );
// wir malen ein dunkles Rähmchen um eine graue Fläche
QPen pen( QColor( 66,66,66 ) );
pen.setWidth( 2 );
painter.setPen( pen );
QRect frame = rect();
frame.adjust( _frameOffset, _frameOffset, -_frameOffset, -_frameOffset );
painter.fillRect( frame, QColor( 44,44,44 ) );
painter.drawRoundedRect( frame, 2, 2 );
double sizeX = frame.width();
double sizeY = frame.height();
int blockWidth = qRound( sizeX / _numBars );
int blockHeight = qRound( sizeY / _numBlocks );
//_padding = 2;
int numColors = _colors.size();
double factorColors = (double) numColors / (double) _numBlocks;
int blockPosX = _frameOffset + _padding;
int maxX = qRound( (double) _value / double( _rangeTo ) * sizeX );
int maxBlocks = (double) sizeY / blockHeight - 3;
for( ; blockPosX < maxX; blockPosX += blockWidth )
{
// hack
int numBlocks = qMin( 1 + qRound( (double) blockPosX / sizeX * maxBlocks ), maxBlocks );
int blockPosY = sizeY - blockHeight;// + _padding;
for( int j = 0; j < numBlocks; ++j )
{
QRect blockRect = QRect( blockPosX, blockPosY, blockWidth - _padding, blockHeight - _padding );
int colorIndex = numColors - 1 - factorColors * (double) j;
//int colorIndex = 2 + factorColors * (double) j;
painter.fillRect( blockRect, _colors[ colorIndex ] );
blockPosY -= blockHeight;
}
}
}