From 54095bace555012ec942c4e37cc7227406fdde00 Mon Sep 17 00:00:00 2001 From: Tom Steer Date: Sat, 31 Jan 2026 12:39:02 +0000 Subject: [PATCH 1/2] #339 : Add Grouping and Offset Options to Channel Check Add spinboxes to select grouping and offset for channel check TODO: Selection should possibly persist --- src/commandline.cpp | 64 +++++--- src/commandline.h | 9 +- src/ui/transmitwindow.cpp | 57 +++---- src/ui/transmitwindow.h | 2 +- ui/transmitwindow.ui | 315 +++++++++++++++++++++++--------------- 5 files changed, 264 insertions(+), 183 deletions(-) diff --git a/src/commandline.cpp b/src/commandline.cpp index a235f300..9322f320 100644 --- a/src/commandline.cpp +++ b/src/commandline.cpp @@ -466,34 +466,14 @@ void EditableLCDNumber::keyPressEvent(QKeyEvent * event) if (event->keyCombination() == Preferences::Instance().getKeyShortcut(KeyShortcutTarget::SHORTCUT_CHANNELCHECK_NEXT)) { - if (intValue() < MAX_DMX_ADDRESS) - { - buf = intValue() + 1; - display(buf); - emit valueChanged(buf); - } - else - { - display(1); - emit valueChanged(1); - } + increment(); return; } if (event->keyCombination() == Preferences::Instance().getKeyShortcut(KeyShortcutTarget::SHORTCUT_CHANNELCHECK_PREV)) { - if (intValue() - 1 > 0) - { - buf = intValue() - 1; - display(buf); - emit valueChanged(buf); - } - else - { - display(MAX_DMX_ADDRESS); - emit valueChanged(MAX_DMX_ADDRESS); - } + decrement(); return; } @@ -530,3 +510,43 @@ void EditableLCDNumber::keyPressEvent(QKeyEvent * event) default: break; } } + +void EditableLCDNumber::increment() +{ + auto value = intValue(); + if (value + m_offset <= MAX_DMX_ADDRESS) + { + value += m_offset; + display(value); + emit valueChanged(value); + } + else + { + display(1); + emit valueChanged(1); + } +} + +void EditableLCDNumber::decrement() +{ + auto value = intValue(); + if (value - m_offset > 0) + { + value -= m_offset; + display(value); + emit valueChanged(value); + } + else + { + display(MAX_DMX_ADDRESS); + emit valueChanged(MAX_DMX_ADDRESS); + } +} + +void EditableLCDNumber::setOffset(int offset) +{ + if (offset > 1) + { + m_offset = offset; + } +} diff --git a/src/commandline.h b/src/commandline.h index 02793975..85edbfad 100644 --- a/src/commandline.h +++ b/src/commandline.h @@ -140,9 +140,16 @@ class EditableLCDNumber : public QLCDNumber void valueChanged(int); void toggleOff(); -protected: +public slots: + void increment(); + void decrement(); + void setOffset(int offset); +protected: virtual void keyPressEvent(QKeyEvent * event); + +private: + int m_offset = 1; }; #endif // COMMANDLINE_H diff --git a/src/ui/transmitwindow.cpp b/src/ui/transmitwindow.cpp index a1983561..646bcb39 100644 --- a/src/ui/transmitwindow.cpp +++ b/src/ui/transmitwindow.cpp @@ -54,7 +54,7 @@ transmitwindow::transmitwindow(int universe, QWidget * parent) m_slotCount = MAX_DMX_ADDRESS; ui->sbSlotCount->setValue(m_slotCount); ui->sbSlotCount->setWrapping(true); - + ui->sbFadeRangeEnd->setMinimum(MIN_DMX_ADDRESS); ui->sbFadeRangeEnd->setMaximum(m_slotCount); ui->sbFadeRangeEnd->setValue(m_slotCount); @@ -156,7 +156,9 @@ transmitwindow::transmitwindow(int universe, QWidget * parent) ui->slChannelCheck->setMinimum(0); ui->slChannelCheck->setMaximum(MAX_SACN_LEVEL); ui->slChannelCheck->setValue(MAX_SACN_LEVEL); + ui->lcdNumber->display(1); + connect(ui->sbOffset, &QSpinBox::valueChanged, ui->lcdNumber, &EditableLCDNumber::setOffset); m_blinkTimer = new QTimer(this); m_blinkTimer->setInterval(BLINK_TIME); @@ -526,40 +528,12 @@ void transmitwindow::on_cbPriorityMode_currentIndexChanged(int index) void transmitwindow::on_btnCcNext_pressed() { - int value = ui->lcdNumber->value(); - - if (++value > m_slotCount) value = MIN_DMX_ADDRESS; - - ui->lcdNumber->display(value); - - if (m_sender) - { - // Update levels. - m_sender->setLevelRange(MIN_DMX_ADDRESS - 1, m_slotCount - 1, 0); - m_sender->setLevel(value - 1, ui->slChannelCheck->value()); - - // Update priorities if requested. - updateChanCheckPap(value - 1); - } + ui->lcdNumber->increment(); } void transmitwindow::on_btnCcPrev_pressed() { - int value = ui->lcdNumber->value(); - - if (--value < MIN_DMX_ADDRESS) value = m_slotCount; - - ui->lcdNumber->display(value); - - if (m_sender) - { - // Update levels. - m_sender->setLevelRange(MIN_DMX_ADDRESS - 1, m_slotCount - 1, 0); - m_sender->setLevel(value - 1, ui->slChannelCheck->value()); - - // Update priorities if requested. - updateChanCheckPap(value - 1); - } + ui->lcdNumber->decrement(); } void transmitwindow::on_cbCcPap_toggled(bool checked) @@ -571,7 +545,7 @@ void transmitwindow::on_cbCcPap_toggled(bool checked) if (checked) { - updateChanCheckPap(ui->lcdNumber->value() - 1); + updateChanCheckPap(ui->lcdNumber->value() - 1, ui->sbGrouping->value()); } else { @@ -584,11 +558,17 @@ void transmitwindow::on_lcdNumber_valueChanged(int value) if (m_sender) { // Update levels. + const auto grouping = ui->sbGrouping->value(); + const uint16_t maxAddress = value - 1 + grouping; + m_sender->setLevelRange(0, m_slotCount - 1, 0); - m_sender->setLevel(value - 1, ui->slChannelCheck->value()); + for (auto channel = value - 1; channel < std::min(MAX_DMX_ADDRESS, maxAddress); channel++) + { + m_sender->setLevel(channel, ui->slChannelCheck->value()); + } // Update priorities if requested. - updateChanCheckPap(value - 1); + updateChanCheckPap(value - 1, grouping); } } @@ -666,7 +646,7 @@ void transmitwindow::on_tabWidget_currentChanged(int index) { auto address = ui->lcdNumber->value() - 1; m_sender->setLevel(address, ui->slChannelCheck->value()); - updateChanCheckPap(address); + updateChanCheckPap(address, ui->sbGrouping->value()); ui->lcdNumber->setFocus(); break; @@ -994,7 +974,7 @@ void transmitwindow::on_sbMaxFPS_editingFinished() if (ui->sbMaxFPS->value() < ui->sbMinFPS->value()) ui->sbMaxFPS->setValue(ui->sbMinFPS->value()); } -void transmitwindow::updateChanCheckPap(int address) +void transmitwindow::updateChanCheckPap(int address, int length) { Q_ASSERT(address < DMX_SLOT_MAX); if (address >= m_slotCount) @@ -1009,7 +989,10 @@ void transmitwindow::updateChanCheckPap(int address) } std::array ccPap{0}; - ccPap[address] = m_perAddressPriorities[address]; + for (int i = address; i < std::min(address+length, DMX_SLOT_MAX); i++) + { + ccPap[i] = m_perAddressPriorities[i]; + } m_sender->setPerChannelPriorities(ccPap.data()); } diff --git a/src/ui/transmitwindow.h b/src/ui/transmitwindow.h index 3f069991..055db2f6 100644 --- a/src/ui/transmitwindow.h +++ b/src/ui/transmitwindow.h @@ -104,7 +104,7 @@ private slots: void updateTitle(); void setLevel(int address, int value); void updatePerChanPriorityButton(); - void updateChanCheckPap(int address); + void updateChanCheckPap(int address, int length); void updateFadeRangePap(); Ui::transmitwindow * ui = nullptr; ConfigurePerChanPrioDlg * m_perChannelDialog = nullptr; diff --git a/ui/transmitwindow.ui b/ui/transmitwindow.ui index 19e198ec..96ca7c4c 100644 --- a/ui/transmitwindow.ui +++ b/ui/transmitwindow.ui @@ -110,10 +110,10 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus - Qt::Horizontal + Qt::Orientation::Horizontal @@ -129,7 +129,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Source @@ -144,10 +144,10 @@ border-radius: 4px; - QFrame::NoFrame + QFrame::Shape::NoFrame - QFrame::Plain + QFrame::Shadow::Plain @@ -171,7 +171,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Protocol Version @@ -186,7 +186,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Ratified @@ -205,7 +205,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Draft @@ -249,7 +249,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Source Name: @@ -265,7 +265,7 @@ border-radius: 4px; - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus 63 @@ -281,7 +281,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Universe: @@ -297,10 +297,10 @@ border-radius: 4px; - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -320,7 +320,7 @@ border-radius: 4px; - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -333,7 +333,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Priority Mode: @@ -345,7 +345,7 @@ border-radius: 4px; - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus @@ -380,7 +380,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Set up per-channel priorities @@ -401,7 +401,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Priority: @@ -417,10 +417,10 @@ border-radius: 4px; - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -460,7 +460,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Mode @@ -475,7 +475,7 @@ border-radius: 4px; - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus @@ -488,7 +488,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Unicast to @@ -504,7 +504,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Multicast to @@ -526,7 +526,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Blind-mode data @@ -536,10 +536,10 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus - Qt::Vertical + Qt::Orientation::Vertical @@ -555,7 +555,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Start @@ -572,10 +572,10 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus - 0 + 1 @@ -587,7 +587,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Start @@ -596,7 +596,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Start at : @@ -606,10 +606,10 @@ border-radius: 4px; - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -619,7 +619,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus Presets @@ -639,7 +639,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus @@ -655,7 +655,7 @@ border-radius: 4px; - Qt::NoFocus + Qt::FocusPolicy::NoFocus @@ -664,7 +664,7 @@ border-radius: 4px; - Qt::StrongFocus + Qt::FocusPolicy::StrongFocus @@ -695,12 +695,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus - @@ -725,12 +724,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus THRU @@ -755,12 +753,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus + @@ -789,12 +786,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 7 @@ -819,12 +815,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 8 @@ -849,12 +844,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 9 @@ -879,12 +873,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 4 @@ -909,12 +902,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 5 @@ -939,12 +931,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 6 @@ -969,12 +960,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 1 @@ -999,12 +989,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 3 @@ -1029,12 +1018,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 2 @@ -1059,12 +1047,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus 0 @@ -1089,12 +1076,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus CLEAR @@ -1119,12 +1105,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus ENTER @@ -1155,12 +1140,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus AT @@ -1185,12 +1169,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus ALL OFF @@ -1215,12 +1198,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus FULL @@ -1245,12 +1227,11 @@ border-radius: 4px; Arial 11 - 75 true - Qt::NoFocus + Qt::FocusPolicy::NoFocus OFFSET @@ -1276,10 +1257,10 @@ border-radius: 4px; - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Minimum + QSizePolicy::Policy::Minimum @@ -1298,29 +1279,98 @@ border-radius: 4px; - Qt::StrongFocus + Qt::FocusPolicy::StrongFocus background-color:rgb(0, 0, 0); color: rgb(255, 85, 0); - QFrame::NoFrame + QFrame::Shape::NoFrame - QFrame::Plain + QFrame::Shadow::Plain 3 - QLCDNumber::Flat + QLCDNumber::SegmentStyle::Flat 512 + + + + + + Offset + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + 1 + + + + + + + Grouping + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + 1 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + @@ -1332,7 +1382,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Previous @@ -1342,7 +1392,7 @@ color: rgb(255, 85, 0); - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1365,19 +1415,19 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus 255 - Qt::Horizontal + Qt::Orientation::Horizontal false - QSlider::TicksBelow + QSlider::TickPosition::TicksBelow 20 @@ -1387,7 +1437,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Blink @@ -1421,14 +1471,14 @@ color: rgb(255, 85, 0); - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1447,7 +1497,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Next @@ -1480,7 +1530,7 @@ color: rgb(255, 85, 0); - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus QSpinBox { @@ -1491,7 +1541,7 @@ color: rgb(255, 85, 0); } - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter false @@ -1546,7 +1596,7 @@ color: rgb(255, 85, 0); - Qt::ClickFocus + Qt::FocusPolicy::ClickFocus QSpinBox { @@ -1557,7 +1607,7 @@ color: rgb(255, 85, 0); } - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter false @@ -1580,7 +1630,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Effect Type @@ -1589,7 +1639,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Manual @@ -1602,7 +1652,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Sinewave @@ -1612,7 +1662,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Ramp @@ -1622,7 +1672,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Chase @@ -1635,10 +1685,10 @@ color: rgb(255, 85, 0); false - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -1697,7 +1747,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Text @@ -1707,7 +1757,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Date/Time @@ -1717,7 +1767,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus false @@ -1730,23 +1780,23 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus Speed - 1Hz - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter - Qt::NoFocus + Qt::FocusPolicy::NoFocus - Qt::Vertical + Qt::Orientation::Vertical @@ -1761,7 +1811,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus ... @@ -1775,7 +1825,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus ... @@ -1800,7 +1850,7 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus 0 @@ -1812,10 +1862,10 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus - Qt::Vertical + Qt::Orientation::Vertical @@ -1824,13 +1874,13 @@ color: rgb(255, 85, 0); - Qt::NoFocus + Qt::FocusPolicy::NoFocus 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1841,7 +1891,7 @@ color: rgb(255, 85, 0); - Qt::Vertical + Qt::Orientation::Vertical @@ -1857,7 +1907,7 @@ color: rgb(255, 85, 0); Text to Scroll - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1882,14 +1932,14 @@ color: rgb(255, 85, 0); sACN! - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter - Qt::Vertical + Qt::Orientation::Vertical @@ -1917,7 +1967,7 @@ color: rgb(255, 85, 0); - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1954,7 +2004,7 @@ color: rgb(255, 85, 0); - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1999,6 +2049,27 @@ color: rgb(255, 85, 0);
commandline.h
+ + rbPathwaySecure + lePathwaySecurePassword + sbSlotCount + sbMinFPS + sbMaxFPS + teCommandline + lcdNumber + sbOffset + sbGrouping + cbCcPap + cbFadeRangePap + rbChaseSnap + rbChaseSine + rbChaseRamp + rbVerticalBars + rbHorizBars + rbUsDate + leScrollText + rbEuDate + From e6d000cc851f4b8f45b9a3031fd91970120fa614 Mon Sep 17 00:00:00 2001 From: Tom Steer Date: Sun, 1 Feb 2026 05:05:10 +0000 Subject: [PATCH 2/2] Improve Focus Visibility Improve the focus visibility of the editable LCD number --- src/commandline.cpp | 10 ++++++++++ src/commandline.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/commandline.cpp b/src/commandline.cpp index 9322f320..71ce7bd6 100644 --- a/src/commandline.cpp +++ b/src/commandline.cpp @@ -511,6 +511,16 @@ void EditableLCDNumber::keyPressEvent(QKeyEvent * event) } } +void EditableLCDNumber::focusInEvent(QFocusEvent* event) +{ + setStyleSheet("background-color:rgb(0, 0, 0);\ncolor: rgb(255, 85, 0);"); +} + +void EditableLCDNumber::focusOutEvent(QFocusEvent* event) +{ + setStyleSheet("background-color:rgb(0, 0, 0);\ncolor: rgb(24, 24, 24);"); +} + void EditableLCDNumber::increment() { auto value = intValue(); diff --git a/src/commandline.h b/src/commandline.h index 85edbfad..88495781 100644 --- a/src/commandline.h +++ b/src/commandline.h @@ -147,6 +147,8 @@ public slots: protected: virtual void keyPressEvent(QKeyEvent * event); + virtual void focusInEvent(QFocusEvent* event); + virtual void focusOutEvent(QFocusEvent* event); private: int m_offset = 1;