259 lines
5.4 KiB
C++
259 lines
5.4 KiB
C++
#include "switch.h"
|
|
|
|
Switch::Switch(QWidget *parent) : QWidget(parent)
|
|
{
|
|
setMinimumSize(QSize(1, 1));
|
|
resize(20, 40);
|
|
|
|
}
|
|
|
|
Switch::~Switch()
|
|
{
|
|
|
|
}
|
|
|
|
int16_t Switch::Limit(int16_t pos, int16_t min, int16_t max)
|
|
{
|
|
return ( pos <= min)?(min):((pos >= max)?(max):(pos));
|
|
}
|
|
|
|
void Switch::setRecovery(bool state)
|
|
{
|
|
Recovery = state;
|
|
update();
|
|
}
|
|
|
|
void Switch::setSwitchdir(uint8_t value)
|
|
{
|
|
if(value == 0x00)
|
|
{
|
|
resize(this->width(), this->height());
|
|
}
|
|
else
|
|
{
|
|
resize(this->height(), this->width());
|
|
}
|
|
|
|
m_switchdir = value;
|
|
update();
|
|
}
|
|
|
|
void Switch::setNotice(uint16_t pos,QString str)
|
|
{
|
|
Notice.insert(pos,str);
|
|
}
|
|
|
|
void Switch::setSegment(uint16_t value)
|
|
{
|
|
float size_step = 0;
|
|
size_step = (float)size().height() / m_segment;
|
|
|
|
resize(size().width(),value * size_step);
|
|
|
|
//qDebug() << value << size();
|
|
m_segment = value;
|
|
|
|
update();
|
|
}
|
|
|
|
void Switch::setPosition(uint16_t pos)
|
|
{
|
|
m_position = Limit(pos,0,m_segment-1);
|
|
update();
|
|
}
|
|
|
|
void Switch::setValue(uint16_t value)
|
|
{
|
|
|
|
m_channel = Limit(value,m_min,m_max);
|
|
//m_position = (float)(m_channel - m_min) * (m_segment - 1) / (m_max - m_min);
|
|
|
|
//qDebug() << (m_max - m_min)/m_segment;
|
|
|
|
for(int i = 1;i<=m_segment;i++)
|
|
{
|
|
if(i<(m_segment))
|
|
{
|
|
if((m_channel - m_min) <= (((m_max - m_min)/m_segment)*i))
|
|
{
|
|
m_position = i-1;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if((m_channel - m_min) > (((m_max - m_min)/m_segment)*i))
|
|
{
|
|
m_position = i-1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
update();
|
|
}
|
|
|
|
uint16_t Switch::segment(void)
|
|
{
|
|
return m_segment;
|
|
}
|
|
|
|
uint16_t Switch::position(void)
|
|
{
|
|
return m_position;
|
|
}
|
|
|
|
uint16_t Switch::channel(void)
|
|
{
|
|
return m_channel;
|
|
}
|
|
|
|
void Switch::mouseReleaseEvent(QMouseEvent *e)
|
|
{
|
|
Q_UNUSED(e);
|
|
|
|
if(Recovery == true)
|
|
{
|
|
m_position = m_segment/2;
|
|
}
|
|
|
|
update();
|
|
}
|
|
|
|
void Switch::mousePressEvent(QMouseEvent *e)
|
|
{
|
|
if(m_switchdir == 0)
|
|
{
|
|
m_position = Limit((e->y() / (this->height()/m_segment)),0,m_segment -1 );
|
|
}
|
|
else
|
|
{
|
|
m_position = Limit((e->x() / (this->width()/m_segment)),0,m_segment -1 );
|
|
}
|
|
|
|
m_channel = m_min + (float)(m_position)/(m_segment - 1) * (m_max - m_min);
|
|
//qDebug() << m_channel << m_position;
|
|
emit positionChange(m_channel);
|
|
update();
|
|
}
|
|
|
|
void Switch::mouseMoveEvent(QMouseEvent *e)
|
|
{
|
|
if(m_switchdir == 0)
|
|
{
|
|
m_position = Limit((e->y() / (this->height()/m_segment)),0,m_segment -1 );
|
|
}
|
|
else
|
|
{
|
|
m_position = Limit((e->x() / (this->width()/m_segment)),0,m_segment -1 );
|
|
}
|
|
|
|
m_channel = m_min + (float)(m_position)/(m_segment - 1) * (m_max - m_min);
|
|
emit positionChange(m_channel);
|
|
update();
|
|
}
|
|
|
|
void Switch::paintEvent(QPaintEvent *)
|
|
{
|
|
QPainter painter(this);
|
|
painter.setRenderHint(QPainter::Antialiasing); /* 使用反锯齿(如果可用) */
|
|
painter.translate(width() / 2, height() / 2); /* 坐标变换为窗体中心 */
|
|
//int side = qMin(width(), height());
|
|
if(m_switchdir == 0)
|
|
{
|
|
painter.scale(width() / 500.0, height() / 1000.0); /* 比例缩放 */
|
|
}
|
|
else
|
|
{
|
|
painter.scale(width() / 1000.0, height() / 500.0); /* 比例缩放 */
|
|
}
|
|
painter.setPen(Qt::NoPen);
|
|
|
|
drawSwitch(&painter);
|
|
}
|
|
|
|
void Switch::drawSwitch(QPainter *painter)
|
|
{
|
|
if(m_switchdir == 0)
|
|
{
|
|
painter->save();
|
|
painter->setBrush(QColor("#454545"));
|
|
painter->drawRect(-250,-500,500,1000);
|
|
painter->restore();
|
|
|
|
painter->save();
|
|
painter->setBrush(QColor("#5F9EA0"));
|
|
painter->drawRect(-250,-500 + 1000/m_segment * m_position,500,1000/m_segment);
|
|
painter->restore();
|
|
|
|
painter->save();
|
|
QPen pen;
|
|
pen.setColor(QColor("#FFFFFF"));
|
|
pen.setWidth(20);
|
|
|
|
QFont font;
|
|
font.setPixelSize(150);
|
|
|
|
painter->setFont(font);
|
|
|
|
painter->setPen(pen);
|
|
for(int i = 1;i<m_segment;i++)
|
|
{
|
|
painter->drawLine(-250,-500 + 1000/m_segment * i,250,-500 + 1000/m_segment * i);
|
|
}
|
|
|
|
for (int i = 0;i<m_segment;i++) {
|
|
if(Notice.contains(i))
|
|
{
|
|
painter->drawText(QRect(-250,-500 + 1000/m_segment * i,500,1000/m_segment),Qt::AlignVCenter|Qt::AlignHCenter,Notice.value(i));
|
|
}
|
|
}
|
|
|
|
painter->restore();
|
|
|
|
}
|
|
else
|
|
{
|
|
painter->save();
|
|
painter->setBrush(QColor("#454545"));
|
|
painter->drawRect(-500,-250,1000,500);
|
|
painter->restore();
|
|
|
|
painter->save();
|
|
painter->setBrush(QColor("#5F9EA0"));
|
|
painter->drawRect(-500 + 1000/m_segment * m_position,-250,1000/m_segment,500);
|
|
painter->restore();
|
|
|
|
painter->save();
|
|
|
|
QPen pen;
|
|
pen.setColor(QColor("#FFFFFF"));
|
|
pen.setWidth(20);
|
|
|
|
QFont font;
|
|
font.setPixelSize(150);
|
|
|
|
painter->setFont(font);
|
|
painter->setPen(pen);
|
|
for(int i = 1;i<m_segment;i++)
|
|
{
|
|
painter->drawLine(-500 + 1000/m_segment * i,-250,-500 + 1000/m_segment * i,250);
|
|
}
|
|
|
|
for (int i = 0;i<m_segment;i++) {
|
|
if(Notice.contains(i))
|
|
{
|
|
painter->drawText(QRect(-500 + 1000/m_segment * i,-250,1000/m_segment,500),Qt::AlignVCenter|Qt::AlignHCenter,Notice.value(i));
|
|
}
|
|
}
|
|
|
|
painter->restore();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|