From 8dc9c4a6d7babe4f4608a4370a0e6e1eff582066 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Thu, 2 Jun 2022 16:20:04 +0800 Subject: [PATCH] fix:Device options dialog size adaptived screen --- DSView/pv/dialogs/decoderoptionsdlg.cpp | 4 +- DSView/pv/dialogs/deviceoptions.cpp | 170 +++++++++++++++++------- DSView/pv/dialogs/deviceoptions.h | 19 ++- DSView/pv/dialogs/dsdialog.cpp | 19 ++- DSView/pv/dialogs/dsdialog.h | 3 + DSView/pv/toolbars/titlebar.cpp | 2 +- 6 files changed, 156 insertions(+), 61 deletions(-) diff --git a/DSView/pv/dialogs/decoderoptionsdlg.cpp b/DSView/pv/dialogs/decoderoptionsdlg.cpp index 09734d2d..6d8b1a5b 100644 --- a/DSView/pv/dialogs/decoderoptionsdlg.cpp +++ b/DSView/pv/dialogs/decoderoptionsdlg.cpp @@ -86,7 +86,7 @@ void DecoderOptionsDlg::load_options(view::DecodeTrace *trace) //scroll pannel QWidget *scroll_pannel = new QWidget(); - QHBoxLayout *scroll_lay = new QHBoxLayout(); + QVBoxLayout *scroll_lay = new QVBoxLayout(); scroll_lay->setContentsMargins(0, 0, 0, 0); scroll_lay->setAlignment(Qt::AlignLeft); scroll_pannel->setLayout(scroll_lay); @@ -180,7 +180,7 @@ void DecoderOptionsDlg::load_options(view::DecodeTrace *trace) double sk = QGuiApplication::primaryScreen()->devicePixelRatio(); int srcHeight = QGuiApplication::primaryScreen()->availableSize().height(); if (srcHeight > 700) - srcHeight = 700; + srcHeight = 700; if (h * sk > srcHeight) { diff --git a/DSView/pv/dialogs/deviceoptions.cpp b/DSView/pv/dialogs/deviceoptions.cpp index 5311577e..a07bef93 100755 --- a/DSView/pv/dialogs/deviceoptions.cpp +++ b/DSView/pv/dialogs/deviceoptions.cpp @@ -24,11 +24,16 @@ #include #include -#include +#include +#include +#include +#include +#include #include "dsmessagebox.h" #include "../prop/property.h" #include "../dsvdef.h" +#include "../config/appconfig.h" using namespace boost; using namespace std; @@ -38,46 +43,56 @@ namespace dialogs { DeviceOptions::DeviceOptions(QWidget *parent, DevInst *dev_inst) : DSDialog(parent), - _dev_inst(dev_inst), - _button_box(QDialogButtonBox::Ok, Qt::Horizontal, this), + _dev_inst(dev_inst), _device_options_binding(_dev_inst->dev_inst()) { - _dynamic_box = NULL; - _props_box = NULL; - _config_button = NULL; - _cali_button = NULL; - - QWidget *dlg = this; + _dynamic_box = NULL; + _props_box = NULL; + _config_button = NULL; + _cali_button = NULL; + _layout = NULL; + _dynamic_layout = NULL; + _button_box = NULL; + _dynamic_pannel = NULL; - setTitle(tr("Device Options")); + this->setTitle(tr("Device Options")); + this->SetTitleSpace(0); + this->setFixedWidth(390); + + _layout = new QVBoxLayout(); + _layout->setContentsMargins(0, 0, 0, 0); + _layout->setDirection(QBoxLayout::TopToBottom); + QWidget *mainPanel = new QWidget(); + mainPanel->setLayout(_layout); + this->layout()->addWidget(mainPanel); _props_box = new QGroupBox(tr("Mode"), this); _props_box->setLayout(get_property_form(_props_box)); - _layout.addWidget(_props_box); + _layout->addWidget(_props_box); - _dynamic_box = new QGroupBox(dynamic_widget(_dynamic_layout),this); - - _dynamic_box->setLayout(&_dynamic_layout); - _layout.addWidget(_dynamic_box); + _dynamic_layout = new QGridLayout(); + _dynamic_box = new QGroupBox(dynamic_widget(*_dynamic_layout),this); + _dynamic_box->setLayout(_dynamic_layout); + _layout->addWidget(_dynamic_box); _dynamic_box->setVisible(_dynamic_box->title() != ""); - - _layout.addStretch(1); - _layout.addWidget(&_button_box); - - layout()->addLayout(&_layout); - connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); - connect(_dev_inst, SIGNAL(device_updated()), this, SLOT(reject())); + _layout->addStretch(1); + _button_box = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, this); + this->layout()->addWidget(_button_box); + GVariant* gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_OPERATION_MODE); if (gvar != NULL) { _mode = QString::fromUtf8(g_variant_get_string(gvar, NULL)); g_variant_unref(gvar); } - + connect(&_mode_check, SIGNAL(timeout()), this, SLOT(mode_check())); + connect(_button_box, SIGNAL(accepted()), this, SLOT(accept())); + connect(_dev_inst, SIGNAL(device_updated()), this, SLOT(reject())); + _mode_check.setInterval(100); - _mode_check.start(); + _mode_check.start(); } DeviceOptions::~DeviceOptions(){ @@ -85,7 +100,7 @@ DeviceOptions::~DeviceOptions(){ DESTROY_QT_OBJECT(_props_box); DESTROY_QT_OBJECT(_config_button); DESTROY_QT_OBJECT(_cali_button); -} +} void DeviceOptions::accept() { @@ -148,9 +163,8 @@ void DeviceOptions::reject() QGridLayout * DeviceOptions::get_property_form(QWidget * parent) { QGridLayout *const layout = new QGridLayout(parent); - layout->setVerticalSpacing(5); - - const auto &properties =_device_options_binding.properties(); + layout->setVerticalSpacing(3); + const auto &properties =_device_options_binding.properties(); int i = 0; for(auto &p : properties) @@ -188,6 +202,7 @@ void DeviceOptions::logic_probes(QGridLayout &layout) _probes_label_list.clear(); _probes_checkBox_list.clear(); + //channel count checked if (_dev_inst->dev_inst()->mode == LOGIC) { GVariant *gvar_opts; gsize num_opts; @@ -243,17 +258,6 @@ void DeviceOptions::logic_probes(QGridLayout &layout) connect(probe_checkBox, SIGNAL(released()), this, SLOT(channel_enable())); } - - QPushButton *_enable_all_probes = new QPushButton(tr("Enable All"), this); - QPushButton *_disable_all_probes = new QPushButton(tr("Disable All"), this); - - connect(_enable_all_probes, SIGNAL(clicked()), - this, SLOT(enable_all_probes())); - connect(_disable_all_probes, SIGNAL(clicked()), - this, SLOT(disable_all_probes())); - - layout.addWidget(_enable_all_probes, (row1 + 1) * 2 + row0, 0, 1, 4); - layout.addWidget(_disable_all_probes, (row1 + 1) * 2 + row0, 4, 1, 4); } void DeviceOptions::set_all_probes(bool set) @@ -348,9 +352,9 @@ void DeviceOptions::mode_check() g_variant_unref(gvar); if (mode != _mode) { - dynamic_widget(_dynamic_layout); + dynamic_widget(*_dynamic_layout); _dynamic_box->setVisible(_dynamic_box->title() != ""); - _mode = mode; + _mode = mode; } } @@ -367,7 +371,7 @@ void DeviceOptions::mode_check() i++; } } - } + } } void DeviceOptions::channel_check() @@ -377,7 +381,7 @@ void DeviceOptions::channel_check() text.remove('&'); if(sc != NULL) _dev_inst->set_config(NULL, NULL, SR_CONF_CHANNEL_MODE, g_variant_new_string(text.toUtf8().data())); - dynamic_widget(_dynamic_layout); + dynamic_widget(*_dynamic_layout); _dynamic_box->setVisible(_dynamic_box->title() != ""); } @@ -393,7 +397,7 @@ void DeviceOptions::analog_channel_check() g_variant_new_boolean(sc->isChecked())); } } - dynamic_widget(_dynamic_layout); + dynamic_widget(*_dynamic_layout); _dynamic_box->setVisible(_dynamic_box->title() != ""); } @@ -454,9 +458,85 @@ void DeviceOptions::channel_enable() } } +void DeviceOptions::load_logic_channels(QGridLayout &_dynamic_layout) +{ + if (_dynamic_pannel != NULL){ + _dynamic_layout.removeWidget(_dynamic_pannel); + _dynamic_pannel->deleteLater(); + _dynamic_pannel = NULL; + } + _dynamic_pannel = new QWidget(); //dlg + _dynamic_layout.addWidget(_dynamic_pannel); + QVBoxLayout *body_lay = new QVBoxLayout(); + body_lay->setContentsMargins(0,0,5,0); + _dynamic_pannel->setLayout(body_lay); + + QWidget *scroll_pannel = new QWidget(); + QVBoxLayout *scroll_lay = new QVBoxLayout(); + scroll_lay->setContentsMargins(0, 0, 0, 0); + scroll_lay->setAlignment(Qt::AlignLeft); + scroll_pannel->setLayout(scroll_lay); + body_lay->addWidget(scroll_pannel); + + //container + QWidget *container_pannel = new QWidget(); + QGridLayout *container_lay = new QGridLayout(); + container_lay->setContentsMargins(0, 0, 0, 0); + container_pannel->setLayout(container_lay); + scroll_lay->addWidget(container_pannel); + + if (AppConfig::Instance().IsLangCn()) + container_lay->setVerticalSpacing(0); + else + container_lay->setVerticalSpacing(3); + + logic_probes(*container_lay); + + QWidget *button_pannel = new QWidget(); + QPushButton *enable_all_probes = new QPushButton(tr("Enable All")); + QPushButton *disable_all_probes = new QPushButton(tr("Disable All")); + + connect(enable_all_probes, SIGNAL(clicked()), + this, SLOT(enable_all_probes())); + connect(disable_all_probes, SIGNAL(clicked()), + this, SLOT(disable_all_probes())); + + int w = 335; + + QGridLayout *button_lay = new QGridLayout(); + button_pannel->setFixedWidth(300); + button_pannel->setFixedHeight(28); + button_pannel->setLayout(button_lay); + button_lay->setSpacing(5); + button_lay->addWidget(enable_all_probes,0, 0, 1, 1); + button_lay->addWidget(disable_all_probes, 0, 1, 1, 1); + button_lay->setColumnStretch(0, 1); + button_lay->setColumnStretch(1, 1); + button_lay->setContentsMargins(0,0,0,0); + body_lay->addWidget(button_pannel); + + QSize tsize = _dynamic_pannel->sizeHint(); + double sk = QGuiApplication::primaryScreen()->devicePixelRatio(); + int srcHeight = 200; + + if (sk * tsize.height() > srcHeight) + { + QScrollArea *scroll = new QScrollArea(scroll_pannel); + scroll->setWidget(container_pannel); + scroll->setStyleSheet("QScrollArea{border:none;}"); + scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + _dynamic_pannel->setFixedSize(w, srcHeight); + scroll_pannel->setFixedSize(w - 15, srcHeight - 50); + scroll->setFixedSize(w - 15, srcHeight - 50); + } + _dynamic_pannel->setFixedWidth(w); +} + QString DeviceOptions::dynamic_widget(QGridLayout& inner_layout) { + if (_dev_inst->dev_inst()->mode == LOGIC) { - logic_probes(inner_layout); + load_logic_channels(inner_layout); return tr("Channels"); } else if (_dev_inst->dev_inst()->mode == DSO) { diff --git a/DSView/pv/dialogs/deviceoptions.h b/DSView/pv/dialogs/deviceoptions.h index 272a7a58..b388fdbf 100755 --- a/DSView/pv/dialogs/deviceoptions.h +++ b/DSView/pv/dialogs/deviceoptions.h @@ -70,9 +70,10 @@ private: void logic_probes(QGridLayout& layout); void analog_probes(QGridLayout& layout); QString dynamic_widget(QGridLayout &_dynamic_layout); + void load_logic_channels(QGridLayout &_dynamic_layout); void set_all_probes(bool set); - void enable_max_probes(); + void enable_max_probes(); private slots: void enable_all_probes(); @@ -85,23 +86,21 @@ private slots: void channel_enable(); private: - DevInst *_dev_inst; - QVBoxLayout _layout; - - QGroupBox *_dynamic_box; - QGridLayout _dynamic_layout; + DevInst *_dev_inst; + QVBoxLayout *_layout; + QGroupBox *_dynamic_box; + QGridLayout *_dynamic_layout; QVector _probes_label_list; QVector _probes_checkBox_list; QVector _probe_widget_list; - QGroupBox *_props_box; - QPushButton *_config_button; QPushButton *_cali_button; - QDialogButtonBox _button_box; + QDialogButtonBox *_button_box; QTimer _mode_check; - QString _mode; + QString _mode; + QWidget *_dynamic_pannel; pv::prop::binding::DeviceOptions _device_options_binding; QVector _probe_options_binding_list; diff --git a/DSView/pv/dialogs/dsdialog.cpp b/DSView/pv/dialogs/dsdialog.cpp index 33f46cfa..f9f8e392 100755 --- a/DSView/pv/dialogs/dsdialog.cpp +++ b/DSView/pv/dialogs/dsdialog.cpp @@ -60,6 +60,7 @@ DSDialog::DSDialog(QWidget *parent, bool hasClose, bool bBaseButton) : _titlebar = NULL; _shadow = NULL; _base_button = NULL; + _titleSpaceLine = NULL; m_callback = NULL; _clickYes = false; @@ -128,6 +129,18 @@ int DSDialog::exec() return QDialog::exec(); } + void DSDialog::SetTitleSpace(int h) + { + if (_titleSpaceLine != NULL){ + if (h > 0){ + _titleSpaceLine->setFixedHeight(h); + _titleSpaceLine->setVisible(true); + } + else{ + _titleSpaceLine->setVisible(false); + } + } + } void DSDialog::build_base(bool hasClose) { @@ -145,9 +158,9 @@ void DSDialog::build_base(bool hasClose) _titlebar = new toolbars::TitleBar(false, this, hasClose); _main_layout->addWidget(_titlebar); - QWidget *space = new QWidget(this); - space->setFixedHeight(15); - _main_layout->addWidget(space); + _titleSpaceLine = new QWidget(this); + _titleSpaceLine->setFixedHeight(15); + _main_layout->addWidget(_titleSpaceLine); _base_layout = new QVBoxLayout(this); _base_layout->addWidget(_main_widget); diff --git a/DSView/pv/dialogs/dsdialog.h b/DSView/pv/dialogs/dsdialog.h index 00f83ef7..1f586fe3 100755 --- a/DSView/pv/dialogs/dsdialog.h +++ b/DSView/pv/dialogs/dsdialog.h @@ -58,6 +58,8 @@ public: int exec(); inline bool IsClickYes(){return _clickYes;} + void SetTitleSpace(int h); + protected: void accept(); void reject(); @@ -76,6 +78,7 @@ private: QPoint _startPos; bool m_bBaseButton; bool _clickYes; + QWidget *_titleSpaceLine; IDlgCallback *m_callback; }; diff --git a/DSView/pv/toolbars/titlebar.cpp b/DSView/pv/toolbars/titlebar.cpp index 77e97d85..945bf2e2 100755 --- a/DSView/pv/toolbars/titlebar.cpp +++ b/DSView/pv/toolbars/titlebar.cpp @@ -89,7 +89,7 @@ TitleBar::TitleBar(bool top, QWidget *parent, bool hasClose) : lay1->setContentsMargins(0,0,0,0); lay1->setSpacing(0); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); } TitleBar::~TitleBar(){