fix: The layout of calibration dialog displayed error when change vdiv by mouse whell event

This commit is contained in:
dreamsourcelabTAI 2024-05-24 14:55:50 +08:00
parent 33c2c8fdfc
commit 169617e7b0
2 changed files with 156 additions and 118 deletions

View File

@ -59,7 +59,7 @@ Calibration::Calibration(QWidget *parent) :
_reset_btn = NULL; _reset_btn = NULL;
_exit_btn = NULL; _exit_btn = NULL;
_flayout = NULL; _flayout = NULL;
_is_setting = false;
#ifdef Q_OS_DARWIN #ifdef Q_OS_DARWIN
Qt::WindowFlags flags = windowFlags(); Qt::WindowFlags flags = windowFlags();
@ -98,6 +98,8 @@ Calibration::Calibration(QWidget *parent) :
layout()->addLayout(glayout); layout()->addLayout(glayout);
BuildUI();
connect(_save_btn, SIGNAL(clicked()), this, SLOT(on_save())); connect(_save_btn, SIGNAL(clicked()), this, SLOT(on_save()));
connect(_abort_btn, SIGNAL(clicked()), this, SLOT(on_abort())); connect(_abort_btn, SIGNAL(clicked()), this, SLOT(on_abort()));
connect(_reset_btn, SIGNAL(clicked()), this, SLOT(on_reset())); connect(_reset_btn, SIGNAL(clicked()), this, SLOT(on_reset()));
@ -127,27 +129,12 @@ void Calibration::retranslateUi()
setTitle(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_MANUAL_CALIBRATION), "Manual Calibration")); setTitle(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_MANUAL_CALIBRATION), "Manual Calibration"));
} }
void Calibration::update_device_info() void Calibration::BuildUI()
{ {
if (_device_agent->have_instance() == false){ if (_device_agent->have_instance() == false){
assert(false); assert(false);
} }
assert(_params.empty());
for(std::list<QSlider *>::const_iterator i = _slider_list.begin();
i != _slider_list.end(); i++) {
(*i)->setParent(NULL);
_flayout->removeWidget((*i));
delete (*i);
}
_slider_list.clear();
for(std::list<QLabel *>::const_iterator i = _label_list.begin();
i != _label_list.end(); i++) {
(*i)->setParent(NULL);
_flayout->removeWidget((*i));
delete (*i);
}
_label_list.clear();
_flayout->setSpacing(15); _flayout->setSpacing(15);
@ -155,26 +142,80 @@ void Calibration::update_device_info()
sr_channel *const probe = (sr_channel*)l->data; sr_channel *const probe = (sr_channel*)l->data;
assert(probe); assert(probe);
QSlider *gain_slider = new QSlider(Qt::Horizontal, this);
QLabel *gain_label = new QLabel("gain", this);
gain_label->setAlignment(Qt::AlignVCenter);
_flayout->addRow(gain_label, gain_slider);
QSlider *off_slider = new QSlider(Qt::Horizontal, this);
QLabel *off_label = new QLabel("off", this);
off_label->setAlignment(Qt::AlignVCenter);
_flayout->addRow(off_label, off_slider);
QSlider *comp_slider = NULL;
QLabel *comp_label = NULL;
bool comb_comp_en = false;
_device_agent->get_config_bool(SR_CONF_PROBE_COMB_COMP_EN, comb_comp_en);
if (comb_comp_en){
comp_slider = new QSlider(Qt::Horizontal, this);
comp_label = new QLabel("comp", this);
comp_label->setAlignment(Qt::AlignVCenter);
_flayout->addRow(comp_label, comp_slider);
}
channel_param_widget form;
form.gain.lable = gain_label;
form.gain.slider = gain_slider;
form.off.lable = off_label;
form.off.slider = off_slider;
form.comp.lable = comp_label;
form.comp.slider = comp_slider;
form.probe = probe;
_params.push_back(form);
connect(gain_slider, SIGNAL(valueChanged(int)), this, SLOT(set_value(int)));
connect(off_slider, SIGNAL(valueChanged(int)), this, SLOT(set_value(int)));
if (comp_slider != NULL){
connect(comp_slider, SIGNAL(valueChanged(int)), this, SLOT(set_value(int)));
}
}
QWidget *spaceLine = new QWidget();
spaceLine->setFixedHeight(10);
_flayout->addRow(spaceLine);
}
void Calibration::update_device_info()
{
if (_device_agent->have_instance() == false){
assert(false);
}
int dex = -1;
_is_setting = true;
for (const GSList *l = _device_agent->get_channels(); l; l = l->next) {
sr_channel *const probe = (sr_channel*)l->data;
dex++;
assert(dex < _params.size());
auto *form = &_params[dex];
assert(form->probe == probe);
uint64_t vgain = 0, vgain_default = 0; uint64_t vgain = 0, vgain_default = 0;
int vgain_range = 0; int vgain_range = 0;
_device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN, vgain, probe, NULL); _device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN, vgain, probe, NULL);
_device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN_DEFAULT, vgain_default, probe, NULL); _device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN_DEFAULT, vgain_default, probe, NULL);
_device_agent->get_config_uint16(SR_CONF_PROBE_VGAIN_RANGE, vgain_range, probe, NULL); _device_agent->get_config_uint16(SR_CONF_PROBE_VGAIN_RANGE, vgain_range, probe, NULL);
QSlider *gain_slider = new QSlider(Qt::Horizontal, this); form->gain.slider->setRange(-vgain_range/2, vgain_range/2);
gain_slider->setRange(-vgain_range/2, vgain_range/2); form->gain.slider->setValue(vgain - vgain_default);
gain_slider->setValue(vgain - vgain_default);
gain_slider->setObjectName(VGAIN+probe->index);
QString gain_string = CHANNEL_LABEL + QString::number(probe->index) + VGAIN;
QLabel *gain_label = new QLabel(gain_string, this);
ui::adjust_label_size(gain_label, ui::ADJUST_HEIGHT);
gain_slider->setFixedHeight(gain_label->size().height());
gain_label->setAlignment(Qt::AlignVCenter);
_flayout->addRow(gain_label, gain_slider);
_slider_list.push_back(gain_slider);
_label_list.push_back(gain_label);
uint64_t voff = 0; uint64_t voff = 0;
uint16_t voff_range = 0; uint16_t voff_range = 0;
int v; int v;
@ -185,51 +226,22 @@ void Calibration::update_device_info()
if (_device_agent->get_config_uint16(SR_CONF_PROBE_PREOFF_MARGIN, v, probe, NULL)) { if (_device_agent->get_config_uint16(SR_CONF_PROBE_PREOFF_MARGIN, v, probe, NULL)) {
voff_range = (uint16_t)v; voff_range = (uint16_t)v;
} }
QSlider *off_slider = new QSlider(Qt::Horizontal, this); form->off.slider->setRange(0, voff_range);
off_slider->setRange(0, voff_range); form->off.slider->setValue(voff);
off_slider->setValue(voff);
off_slider->setObjectName(VOFF+probe->index); if (form->comp.slider != NULL) {
QString off_string = CHANNEL_LABEL + QString::number(probe->index) + VOFF;
QLabel *off_label = new QLabel(off_string, this);
ui::adjust_label_size(off_label, ui::ADJUST_HEIGHT);
off_slider->setFixedHeight(off_label->size().height());
off_label->setAlignment(Qt::AlignVCenter);
_flayout->addRow(off_label, off_slider);
_slider_list.push_back(off_slider);
_label_list.push_back(off_label);
bool comb_comp_en = false;
_device_agent->get_config_bool(SR_CONF_PROBE_COMB_COMP_EN, comb_comp_en);
if (comb_comp_en) {
int comb_comp = 0; int comb_comp = 0;
_device_agent->get_config_int16(SR_CONF_PROBE_COMB_COMP, comb_comp, probe, NULL); _device_agent->get_config_int16(SR_CONF_PROBE_COMB_COMP, comb_comp, probe, NULL);
QSlider *comp_slider = new QSlider(Qt::Horizontal, this); form->comp.slider->setRange(-127, 127);
comp_slider->setRange(-127, 127); form->comp.slider->setValue(comb_comp);
comp_slider->setValue(comb_comp); }
comp_slider->setObjectName(VCOMB+probe->index);
QString comp_string = CHANNEL_LABEL + QString::number(probe->index) + VCOMB;
QLabel *comp_label = new QLabel(comp_string, this);
ui::adjust_label_size(comp_label, ui::ADJUST_HEIGHT);
comp_slider->setFixedHeight(comp_label->size().height());
comp_label->setAlignment(Qt::AlignVCenter);
_flayout->addRow(comp_label, comp_slider);
_slider_list.push_back(comp_slider);
_label_list.push_back(comp_label);
connect(comp_slider, SIGNAL(valueChanged(int)), this, SLOT(set_value(int)));
}
connect(gain_slider, SIGNAL(valueChanged(int)), this, SLOT(set_value(int)));
connect(off_slider, SIGNAL(valueChanged(int)), this, SLOT(set_value(int)));
} }
QWidget *spaceLine = new QWidget();
spaceLine->setFixedHeight(10);
_flayout->addRow(spaceLine);
update(); update();
_is_setting = false;
} }
void Calibration::reject() void Calibration::reject()
@ -251,26 +263,26 @@ void Calibration::keyPressEvent(QKeyEvent *event)
void Calibration::set_value(int value) void Calibration::set_value(int value)
{ {
QSlider* sc = dynamic_cast<QSlider *>(sender()); if (_is_setting){
return;
}
for (const GSList *l = _device_agent->get_channels(); l; l = l->next) { const QSlider* sc = dynamic_cast<QSlider *>(sender());
sr_channel *const probe = (sr_channel*)l->data;
assert(probe); for (auto &form : _params)
if (sc->objectName() == VGAIN+probe->index) { {
if (form.gain.slider == sc){
uint64_t vgain_default; uint64_t vgain_default;
if (_device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN_DEFAULT, vgain_default, probe)) if (_device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN_DEFAULT, vgain_default, form.probe)){
{ _device_agent->set_config_uint64(SR_CONF_PROBE_VGAIN, value+vgain_default, form.probe);
_device_agent->set_config_uint64(SR_CONF_PROBE_VGAIN, value+vgain_default, probe);
} }
break;
} }
else if (sc->objectName() == VOFF+probe->index) { else if (form.off.slider == sc){
_device_agent->set_config_uint16(SR_CONF_PROBE_PREOFF, value, probe); _device_agent->set_config_uint16(SR_CONF_PROBE_PREOFF, value, form.probe);
break;
} else if (sc->objectName() == VCOMB+probe->index) {
_device_agent->set_config_int16(SR_CONF_PROBE_COMB_COMP, value, probe);
break;
} }
else if (form.comp.slider == sc){
_device_agent->set_config_int16(SR_CONF_PROBE_COMB_COMP, value, form.probe);
}
} }
} }
@ -330,33 +342,7 @@ void Calibration::on_abort()
void Calibration::reload_value() void Calibration::reload_value()
{ {
for (const GSList *l = _device_agent->get_channels(); l; l = l->next) { update_device_info();
sr_channel *const probe = (sr_channel*)l->data;
assert(probe);
uint64_t vgain = 0, vgain_default = 0;
int vgain_range = 0;
_device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN, vgain, probe, NULL);
_device_agent->get_config_uint64(SR_CONF_PROBE_VGAIN_DEFAULT, vgain_default, probe, NULL);
_device_agent->get_config_uint16(SR_CONF_PROBE_VGAIN_RANGE, vgain_range, probe, NULL);
int voff = 0;
int voff_range = 0;
_device_agent->get_config_uint16(SR_CONF_PROBE_PREOFF, voff, probe, NULL);
_device_agent->get_config_uint16(SR_CONF_PROBE_PREOFF_MARGIN, voff_range, probe, NULL);
for(std::list<QSlider*>::iterator i = _slider_list.begin();
i != _slider_list.end(); i++) {
if ((*i)->objectName() == VGAIN+probe->index) {
(*i)->setRange(-vgain_range/2, vgain_range/2);
(*i)->setValue(vgain - vgain_default);
} else if ((*i)->objectName() == VOFF+probe->index) {
(*i)->setRange(0, voff_range);
(*i)->setValue(voff);
}
}
}
} }
void Calibration::on_reset() void Calibration::on_reset()
@ -377,6 +363,42 @@ void Calibration::updateLangText()
VOFF = sp + L_S(STR_PAGE_DLG, S_ID(IDS_CALIB_VOFF), "VOFF"); VOFF = sp + L_S(STR_PAGE_DLG, S_ID(IDS_CALIB_VOFF), "VOFF");
VCOMB = sp + L_S(STR_PAGE_DLG, S_ID(IDS_CALIB_VCOMB), "VCOMB"); VCOMB = sp + L_S(STR_PAGE_DLG, S_ID(IDS_CALIB_VCOMB), "VCOMB");
CHANNEL_LABEL = L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CHANNEL), "Channel"); CHANNEL_LABEL = L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CHANNEL), "Channel");
for(auto &form : _params)
{
QString gain_string = CHANNEL_LABEL + QString::number(form.probe->index) + VGAIN;
QString off_string = CHANNEL_LABEL + QString::number(form.probe->index) + VOFF;
QString comp_string = CHANNEL_LABEL + QString::number(form.probe->index) + VCOMB;
form.gain.lable->setText(gain_string);
form.off.lable->setText(off_string);
if (form.comp.lable != NULL){
form.comp.lable->setText(comp_string);
}
{
auto lable = form.gain.lable;
auto slider = form.gain.slider;
ui::adjust_label_size(lable, ui::ADJUST_HEIGHT);
slider->setFixedHeight(lable->size().height());
}
{
auto lable = form.off.lable;
auto slider = form.off.slider;
ui::adjust_label_size(lable, ui::ADJUST_HEIGHT);
slider->setFixedHeight(lable->size().height());
}
if (form.comp.lable != NULL)
{
auto lable = form.comp.lable;
auto slider = form.comp.slider;
ui::adjust_label_size(lable, ui::ADJUST_HEIGHT);
slider->setFixedHeight(lable->size().height());
}
}
} }
void Calibration::UpdateLanguage() void Calibration::UpdateLanguage()

View File

@ -28,13 +28,14 @@
#include <QLabel> #include <QLabel>
#include <QFormLayout> #include <QFormLayout>
#include <QSlider> #include <QSlider>
#include <list> #include <vector>
#include <QKeyEvent> #include <QKeyEvent>
#include "../toolbars/titlebar.h" #include "../toolbars/titlebar.h"
#include "dsdialog.h" #include "dsdialog.h"
#include "../ui/uimanager.h" #include "../ui/uimanager.h"
class DeviceAgent; class DeviceAgent;
struct sr_channel;
namespace pv { namespace pv {
@ -44,6 +45,20 @@ class Calibration : public DSDialog, public IUiWindow
{ {
Q_OBJECT Q_OBJECT
struct ui_param_info
{
QLabel *lable;
QSlider *slider;
};
struct channel_param_widget
{
ui_param_info gain;
ui_param_info off;
ui_param_info comp;
sr_channel *probe;
};
public: public:
Calibration(QWidget *parent); Calibration(QWidget *parent);
~Calibration(); ~Calibration();
@ -64,6 +79,7 @@ private:
void UpdateFont() override; void UpdateFont() override;
void updateLangText(); void updateLangText();
void BuildUI();
private slots: private slots:
void set_value(int value); void set_value(int value);
@ -78,10 +94,10 @@ private:
QPushButton *_reset_btn; QPushButton *_reset_btn;
QPushButton *_exit_btn; QPushButton *_exit_btn;
QFormLayout *_flayout; QFormLayout *_flayout;
std::list <QSlider *> _slider_list; std::vector<channel_param_widget> _params;
std::list<QLabel *> _label_list;
DeviceAgent *_device_agent; DeviceAgent *_device_agent;
bool _is_setting;
}; };
} // namespace dialogs } // namespace dialogs