mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-27 15:26:33 -04:00
ValueDial fixes
This commit is contained in:
parent
c0919b1129
commit
105873bfda
@ -82,7 +82,6 @@ RemoteInputGui::RemoteInputGui(DeviceUISet *deviceUISet, QWidget* parent) :
|
||||
|
||||
ui->centerFrequencyHz->setColorMapper(ColorMapper(ColorMapper::GrayGold));
|
||||
ui->centerFrequencyHz->setValueRange(3, 0, 999U);
|
||||
ui->centerFrequencyHz->setValue(1);
|
||||
|
||||
CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop);
|
||||
connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &)));
|
||||
|
@ -16,11 +16,11 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QPainter>
|
||||
#include <QMouseEvent>
|
||||
#include <QWheelEvent>
|
||||
#include <QKeyEvent>
|
||||
#include <QLocale>
|
||||
#include <QMouseEvent>
|
||||
#include <QPainter>
|
||||
#include <QWheelEvent>
|
||||
|
||||
#include "gui/valuedial.h"
|
||||
|
||||
@ -74,8 +74,9 @@ void ValueDial::setFont(const QFont& font)
|
||||
QFontMetrics fm(font);
|
||||
m_digitWidth = fm.width('0');
|
||||
m_digitHeight = fm.ascent();
|
||||
if(m_digitWidth < m_digitHeight)
|
||||
if (m_digitWidth < m_digitHeight) {
|
||||
m_digitWidth = m_digitHeight;
|
||||
}
|
||||
setFixedWidth((m_numDigits + m_numDecimalPoints) * m_digitWidth + 2);
|
||||
setFixedHeight(m_digitHeight * 2 + 2);
|
||||
}
|
||||
@ -99,19 +100,24 @@ void ValueDial::setColorMapper(ColorMapper colorMapper)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ValueDial::setValue(quint64 value)
|
||||
{
|
||||
m_valueNew = value;
|
||||
if(m_valueNew < m_valueMin)
|
||||
|
||||
if (m_valueNew < m_valueMin) {
|
||||
m_valueNew = m_valueMin;
|
||||
else if(m_valueNew > m_valueMax)
|
||||
} else if (m_valueNew > m_valueMax) {
|
||||
m_valueNew = m_valueMax;
|
||||
if(m_valueNew < m_value)
|
||||
}
|
||||
|
||||
if (m_valueNew < m_value) {
|
||||
m_animationState = 1;
|
||||
else if(m_valueNew > m_value)
|
||||
} else if (m_valueNew > m_value) {
|
||||
m_animationState = -1;
|
||||
else return;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
m_animationTimer.start(20);
|
||||
m_textNew = formatText(m_valueNew);
|
||||
}
|
||||
@ -119,16 +125,18 @@ void ValueDial::setValue(quint64 value)
|
||||
void ValueDial::setValueRange(uint numDigits, quint64 min, quint64 max)
|
||||
{
|
||||
m_numDigits = numDigits;
|
||||
//m_numDecimalPoints = m_numDigits / 3;
|
||||
m_numDecimalPoints = m_numDigits < 3 ? 0 : (m_numDigits % 3) == 0 ? (m_numDigits / 3) - 1 : m_numDigits / 3;
|
||||
|
||||
m_valueMin = min;
|
||||
m_valueMax = max;
|
||||
|
||||
if(m_value < min)
|
||||
m_text = formatText(m_value);
|
||||
|
||||
if (m_value < min) {
|
||||
setValue(min);
|
||||
else if(m_value > max)
|
||||
} else if (m_value > max) {
|
||||
setValue(max);
|
||||
}
|
||||
|
||||
setFixedWidth((m_numDigits + m_numDecimalPoints) * m_digitWidth + 2);
|
||||
}
|
||||
|
||||
@ -137,21 +145,31 @@ quint64 ValueDial::findExponent(int digit)
|
||||
quint64 e = 1;
|
||||
int d = (m_numDigits + m_numDecimalPoints) - digit;
|
||||
d = d - (d / 4) - 1;
|
||||
for(int i = 0; i < d; i++)
|
||||
|
||||
for (int i = 0; i < d; i++) {
|
||||
e *= 10;
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
QChar ValueDial::digitNeigh(QChar c, bool dir)
|
||||
{
|
||||
if(dir) {
|
||||
if(c == QChar('0'))
|
||||
if (dir)
|
||||
{
|
||||
if (c == QChar('0')) {
|
||||
return QChar('9');
|
||||
else return QChar::fromLatin1(c.toLatin1() - 1);
|
||||
} else {
|
||||
if(c == QChar('9'))
|
||||
return QChar::fromLatin1(c.toLatin1() - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (c == QChar('9')) {
|
||||
return QChar('0');
|
||||
else return QChar::fromLatin1(c.toLatin1() + 1);
|
||||
} else {
|
||||
return QChar::fromLatin1(c.toLatin1() + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -163,7 +181,8 @@ QString ValueDial::formatText(quint64 value)
|
||||
{
|
||||
int ipoint = m_numDigits - 3 - 3 * i;
|
||||
|
||||
if (ipoint != 0) { // do not insert leading point
|
||||
if (ipoint != 0)
|
||||
{ // do not insert leading point
|
||||
const QLocale &cLocale = QLocale::c();
|
||||
str.insert(ipoint, cLocale.groupSeparator());
|
||||
}
|
||||
@ -214,18 +233,24 @@ void ValueDial::paintEvent(QPaintEvent*)
|
||||
|
||||
if (m_animationState == 0)
|
||||
{
|
||||
for(int i = 0; i < m_text.length(); i++) {
|
||||
for (int i = 0; i < m_text.length(); i++)
|
||||
{
|
||||
painter.setClipRect(1 + i * m_digitWidth, 1, m_digitWidth, m_digitHeight * 2);
|
||||
painter.setPen(m_colorMapper.getSecondaryForegroundColor());
|
||||
painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * 0.6, m_digitWidth, m_digitHeight), Qt::AlignCenter, m_text.mid(i, 1));
|
||||
if(m_text[i] != m_groupSeparator) {
|
||||
|
||||
if (m_text[i] != m_groupSeparator)
|
||||
{
|
||||
painter.setPen(m_colorMapper.getForegroundColor());
|
||||
painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * -0.7, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], true));
|
||||
painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * 1.9, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], false));
|
||||
}
|
||||
}
|
||||
|
||||
painter.setClipping(false);
|
||||
if((m_cursor >= 0) && (m_cursorState)) {
|
||||
|
||||
if ((m_cursor >= 0) && (m_cursorState))
|
||||
{
|
||||
painter.setPen(Qt::NoPen);
|
||||
painter.setBrush(m_colorMapper.getSecondaryForegroundColor());
|
||||
painter.drawRect(4 + m_cursor * m_digitWidth, 1 + m_digitHeight * 1.5, m_digitWidth - 5, m_digitHeight / 6);
|
||||
@ -311,12 +336,14 @@ void ValueDial::mousePressEvent(QMouseEvent* event)
|
||||
void ValueDial::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = (event->x() - 1) / m_digitWidth;
|
||||
if(m_text[i] == m_groupSeparator)
|
||||
i = -1;
|
||||
|
||||
if(i != m_hightlightedDigit) {
|
||||
if (m_text[i] == m_groupSeparator) {
|
||||
i = -1;
|
||||
}
|
||||
|
||||
if (i != m_hightlightedDigit)
|
||||
{
|
||||
m_hightlightedDigit = i;
|
||||
update();
|
||||
}
|
||||
@ -325,40 +352,54 @@ void ValueDial::mouseMoveEvent(QMouseEvent* event)
|
||||
void ValueDial::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = (event->x() - 1) / m_digitWidth;
|
||||
if(m_text[i] != m_groupSeparator)
|
||||
m_hightlightedDigit = i;
|
||||
else
|
||||
return;
|
||||
|
||||
if(m_cursor >= 0) {
|
||||
if (m_text[i] != m_groupSeparator) {
|
||||
m_hightlightedDigit = i;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_cursor >= 0)
|
||||
{
|
||||
m_cursor = -1;
|
||||
m_blinkTimer.stop();
|
||||
update();
|
||||
}
|
||||
|
||||
quint64 e = findExponent(m_hightlightedDigit);
|
||||
|
||||
if(m_animationState == 0) {
|
||||
if(event->delta() < 0) {
|
||||
if (m_animationState == 0)
|
||||
{
|
||||
if (event->delta() < 0)
|
||||
{
|
||||
if (event->modifiers() & Qt::ShiftModifier) {
|
||||
e *= 5;
|
||||
} else if (event->modifiers() & Qt::ControlModifier) {
|
||||
e *= 2;
|
||||
}
|
||||
if(m_value < e)
|
||||
|
||||
if (m_value < e) {
|
||||
m_valueNew = m_valueMin;
|
||||
else m_valueNew = m_value - e;
|
||||
} else {
|
||||
m_valueNew = m_value - e;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (event->modifiers() & Qt::ShiftModifier) {
|
||||
e *= 5;
|
||||
} else if (event->modifiers() & Qt::ControlModifier) {
|
||||
e *= 2;
|
||||
}
|
||||
if(m_valueMax - m_value < e)
|
||||
|
||||
if (m_valueMax - m_value < e) {
|
||||
m_valueNew = m_valueMax;
|
||||
else m_valueNew = m_value + e;
|
||||
} else {
|
||||
m_valueNew = m_value + e;
|
||||
}
|
||||
}
|
||||
|
||||
setValue(m_valueNew);
|
||||
emit changed(m_valueNew);
|
||||
event->accept();
|
||||
@ -367,7 +408,8 @@ void ValueDial::wheelEvent(QWheelEvent* event)
|
||||
|
||||
void ValueDial::leaveEvent(QEvent *)
|
||||
{
|
||||
if(m_hightlightedDigit != -1) {
|
||||
if (m_hightlightedDigit != -1)
|
||||
{
|
||||
m_hightlightedDigit = -1;
|
||||
update();
|
||||
}
|
||||
@ -375,8 +417,10 @@ void ValueDial::leaveEvent(QEvent*)
|
||||
|
||||
void ValueDial::keyPressEvent(QKeyEvent *value)
|
||||
{
|
||||
if(m_cursor >= 0) {
|
||||
if((value->key() == Qt::Key_Return) || (value->key() == Qt::Key_Enter) || (value->key() == Qt::Key_Escape)) {
|
||||
if (m_cursor >= 0)
|
||||
{
|
||||
if ((value->key() == Qt::Key_Return) || (value->key() == Qt::Key_Enter) || (value->key() == Qt::Key_Escape))
|
||||
{
|
||||
m_cursor = -1;
|
||||
m_cursorState = false;
|
||||
m_blinkTimer.stop();
|
||||
@ -385,102 +429,156 @@ void ValueDial::keyPressEvent(QKeyEvent* value)
|
||||
}
|
||||
}
|
||||
|
||||
if((m_cursor < 0) && (m_hightlightedDigit >= 0)) {
|
||||
if ((m_cursor < 0) && (m_hightlightedDigit >= 0))
|
||||
{
|
||||
m_cursor = m_hightlightedDigit;
|
||||
if(m_text[m_cursor] == m_groupSeparator)
|
||||
|
||||
if (m_text[m_cursor] == m_groupSeparator) {
|
||||
m_cursor++;
|
||||
if(m_cursor >= m_numDigits + m_numDecimalPoints)
|
||||
}
|
||||
|
||||
if (m_cursor >= m_numDigits + m_numDecimalPoints) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_cursorState = true;
|
||||
m_blinkTimer.start(400);
|
||||
update();
|
||||
}
|
||||
|
||||
if(m_cursor < 0)
|
||||
if (m_cursor < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if((value->key() == Qt::Key_Left) || (value->key() == Qt::Key_Backspace)) {
|
||||
if(m_cursor > 0) {
|
||||
if ((value->key() == Qt::Key_Left) || (value->key() == Qt::Key_Backspace))
|
||||
{
|
||||
if (m_cursor > 0)
|
||||
{
|
||||
m_cursor--;
|
||||
if(m_text[m_cursor] == m_groupSeparator)
|
||||
|
||||
if (m_text[m_cursor] == m_groupSeparator) {
|
||||
m_cursor--;
|
||||
if(m_cursor < 0)
|
||||
}
|
||||
|
||||
if (m_cursor < 0) {
|
||||
m_cursor++;
|
||||
}
|
||||
|
||||
m_cursorState = true;
|
||||
update();
|
||||
return;
|
||||
}
|
||||
} else if(value->key() == Qt::Key_Right) {
|
||||
if(m_cursor < m_numDecimalPoints + m_numDigits) {
|
||||
}
|
||||
else if (value->key() == Qt::Key_Right)
|
||||
{
|
||||
if (m_cursor < m_numDecimalPoints + m_numDigits)
|
||||
{
|
||||
m_cursor++;
|
||||
if(m_text[m_cursor] == m_groupSeparator)
|
||||
|
||||
if (m_text[m_cursor] == m_groupSeparator) {
|
||||
m_cursor++;
|
||||
if(m_cursor >= m_numDecimalPoints + m_numDigits)
|
||||
}
|
||||
|
||||
if (m_cursor >= m_numDecimalPoints + m_numDigits) {
|
||||
m_cursor--;
|
||||
}
|
||||
|
||||
m_cursorState = true;
|
||||
update();
|
||||
return;
|
||||
}
|
||||
} else if(value->key() == Qt::Key_Up) {
|
||||
}
|
||||
else if (value->key() == Qt::Key_Up)
|
||||
{
|
||||
quint64 e = findExponent(m_cursor);
|
||||
|
||||
if (value->modifiers() & Qt::ShiftModifier) {
|
||||
e *= 5;
|
||||
} else if (value->modifiers() & Qt::ControlModifier) {
|
||||
e *= 2;
|
||||
}
|
||||
if(m_animationState != 0)
|
||||
|
||||
if (m_animationState != 0) {
|
||||
m_value = m_valueNew;
|
||||
if(m_valueMax - m_value < e)
|
||||
}
|
||||
|
||||
if (m_valueMax - m_value < e) {
|
||||
m_valueNew = m_valueMax;
|
||||
else m_valueNew = m_value + e;
|
||||
} else {
|
||||
m_valueNew = m_value + e;
|
||||
}
|
||||
|
||||
setValue(m_valueNew);
|
||||
emit changed(m_valueNew);
|
||||
} else if(value->key() == Qt::Key_Down) {
|
||||
}
|
||||
else if (value->key() == Qt::Key_Down)
|
||||
{
|
||||
quint64 e = findExponent(m_cursor);
|
||||
|
||||
if (value->modifiers() & Qt::ShiftModifier) {
|
||||
e *= 5;
|
||||
} else if (value->modifiers() & Qt::ControlModifier) {
|
||||
e *= 2;
|
||||
}
|
||||
if(m_animationState != 0)
|
||||
|
||||
if (m_animationState != 0) {
|
||||
m_value = m_valueNew;
|
||||
if(m_value < e)
|
||||
}
|
||||
|
||||
if (m_value < e) {
|
||||
m_valueNew = m_valueMin;
|
||||
else m_valueNew = m_value - e;
|
||||
} else {
|
||||
m_valueNew = m_value - e;
|
||||
}
|
||||
|
||||
setValue(m_valueNew);
|
||||
emit changed(m_valueNew);
|
||||
}
|
||||
|
||||
if(value->text().length() != 1)
|
||||
if (value->text().length() != 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
QChar c = value->text()[0];
|
||||
|
||||
if(c >= QChar('0') && (c <= QChar('9'))) {
|
||||
if (c >= QChar('0') && (c <= QChar('9')))
|
||||
{
|
||||
int d = c.toLatin1() - '0';
|
||||
quint64 e = findExponent(m_cursor);
|
||||
quint64 v = (m_value / e) % 10;
|
||||
if(m_animationState != 0)
|
||||
|
||||
if (m_animationState != 0) {
|
||||
m_value = m_valueNew;
|
||||
}
|
||||
|
||||
v = m_value - v * e;
|
||||
v += d * e;
|
||||
setValue(v);
|
||||
emit changed(m_valueNew);
|
||||
m_cursor++;
|
||||
if(m_text[m_cursor] == m_groupSeparator)
|
||||
|
||||
if (m_text[m_cursor] == m_groupSeparator) {
|
||||
m_cursor++;
|
||||
if(m_cursor >= m_numDigits + m_numDecimalPoints) {
|
||||
}
|
||||
|
||||
if (m_cursor >= m_numDigits + m_numDecimalPoints)
|
||||
{
|
||||
m_cursor = -1;
|
||||
m_blinkTimer.stop();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
m_cursorState = true;
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void ValueDial::focusInEvent(QFocusEvent *)
|
||||
{
|
||||
if(m_cursor == -1) {
|
||||
if (m_cursor == -1)
|
||||
{
|
||||
m_cursor = 0;
|
||||
m_cursorState = true;
|
||||
m_blinkTimer.start(400);
|
||||
@ -500,16 +598,21 @@ void ValueDial::animate()
|
||||
update();
|
||||
|
||||
if (m_animationState > 0)
|
||||
{
|
||||
m_animationState++;
|
||||
else if(m_animationState < 0)
|
||||
}
|
||||
else if (m_animationState < 0) {
|
||||
m_animationState--;
|
||||
else {
|
||||
}
|
||||
else
|
||||
{
|
||||
m_animationTimer.stop();
|
||||
m_animationState = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if(abs(m_animationState) >= 4) {
|
||||
if (abs(m_animationState) >= 4)
|
||||
{
|
||||
m_animationState = 0;
|
||||
m_animationTimer.stop();
|
||||
m_value = m_valueNew;
|
||||
@ -519,7 +622,8 @@ void ValueDial::animate()
|
||||
|
||||
void ValueDial::blink()
|
||||
{
|
||||
if(m_cursor >= 0) {
|
||||
if (m_cursor >= 0)
|
||||
{
|
||||
m_cursorState = !m_cursorState;
|
||||
update();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user