Files
gcs-nf/App/ToolsUI/RemoteControl/switch.cpp
T

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();
}
}