diff --git a/plotjuggler_base/include/PlotJuggler/dialog_utils.h b/plotjuggler_base/include/PlotJuggler/dialog_utils.h new file mode 100644 index 000000000..db4eb0968 --- /dev/null +++ b/plotjuggler_base/include/PlotJuggler/dialog_utils.h @@ -0,0 +1,47 @@ +#ifndef PJ_DIALOG_UTILS_H +#define PJ_DIALOG_UTILS_H + +#include +#include + +namespace PJ +{ + +/** + * @brief Adjusts dialog size to fit contents after widget visibility changes + * + * This function resets dialog size constraints and forces the layout system + * to recalculate the optimal size. Useful when showing/hiding option widgets + * in plugin dialogs. + * + * @param dialog The dialog to resize + */ +inline void adjustDialogToContent(QDialog* dialog, const QString& selected_protocol) +{ + if (!dialog) + { + return; + } + // Reset minimum height and resize dialog + dialog->setMinimumHeight(0); + dialog->layout()->invalidate(); + dialog->layout()->activate(); + + QSize hint; + if (std::set{ "ros1msg", "ros2msg", "data_tamer", "Influx (Line protocol)" }.count( + selected_protocol)) + { + hint = QSize(316, 386); + } + else + { + hint = dialog->sizeHint(); + } + // Force recalculation of size hint + dialog->setMaximumHeight(hint.height()); + dialog->resize(hint); +} + +} // namespace PJ + +#endif // PJ_DIALOG_UTILS_H diff --git a/plotjuggler_plugins/DataStreamMQTT/datastream_mqtt.cpp b/plotjuggler_plugins/DataStreamMQTT/datastream_mqtt.cpp index 5276ff854..368925247 100644 --- a/plotjuggler_plugins/DataStreamMQTT/datastream_mqtt.cpp +++ b/plotjuggler_plugins/DataStreamMQTT/datastream_mqtt.cpp @@ -1,5 +1,6 @@ #include "datastream_mqtt.h" #include "ui_datastream_mqtt.h" +#include "PlotJuggler/dialog_utils.h" #include #include #include @@ -137,6 +138,10 @@ void DataStreamMQTT::onComboProtocolChanged(const QString& selected_protocol) { widget->setVisible(true); } + _dialog->setMinimumHeight(0); + _dialog->layout()->invalidate(); + _dialog->layout()->activate(); + _dialog->resize(_dialog->sizeHint()); } void DataStreamMQTT::onMessageReceived(const mosquitto_message* message) diff --git a/plotjuggler_plugins/DataStreamUDP/udp_server.cpp b/plotjuggler_plugins/DataStreamUDP/udp_server.cpp index dedd47969..5e0a847e1 100644 --- a/plotjuggler_plugins/DataStreamUDP/udp_server.cpp +++ b/plotjuggler_plugins/DataStreamUDP/udp_server.cpp @@ -29,8 +29,10 @@ THE SOFTWARE. #include #include #include +#include #include "ui_udp_server.h" +#include "PlotJuggler/dialog_utils.h" class UdpServerDialog : public QDialog { @@ -110,7 +112,7 @@ bool UDP_Server::start(QStringList*) ParserFactoryPlugin::Ptr parser_creator; - auto onComboChanged = [&](const QString& selected_protocol) { + auto onComboChanged = [this, &dialog, &parser_creator](const QString& selected_protocol) { if (parser_creator) { if (auto prev_widget = parser_creator->optionsWidget()) @@ -124,6 +126,7 @@ bool UDP_Server::start(QStringList*) { widget->setVisible(true); } + adjustDialogToContent(&dialog, selected_protocol); }; connect(dialog.ui->comboBoxProtocol, qOverload(&QComboBox::currentIndexChanged), diff --git a/plotjuggler_plugins/DataStreamWebsocket/websocket_server.cpp b/plotjuggler_plugins/DataStreamWebsocket/websocket_server.cpp index 31b04dd5b..b1b992558 100644 --- a/plotjuggler_plugins/DataStreamWebsocket/websocket_server.cpp +++ b/plotjuggler_plugins/DataStreamWebsocket/websocket_server.cpp @@ -29,6 +29,7 @@ THE SOFTWARE. #include #include "ui_websocket_server.h" +#include "PlotJuggler/dialog_utils.h" class WebsocketDialog : public QDialog { @@ -105,7 +106,7 @@ bool WebsocketServer::start(QStringList*) ParserFactoryPlugin::Ptr parser_creator; connect(dialog->ui->comboBoxProtocol, qOverload(&QComboBox::currentIndexChanged), - this, [&](const QString& selected_protocol) { + this, [this, dialog, &parser_creator](const QString& selected_protocol) { if (parser_creator) { if (auto prev_widget = parser_creator->optionsWidget()) @@ -119,6 +120,8 @@ bool WebsocketServer::start(QStringList*) { widget->setVisible(true); } + + adjustDialogToContent(dialog, selected_protocol); }); dialog->ui->comboBoxProtocol->setCurrentText(protocol); diff --git a/plotjuggler_plugins/DataStreamZMQ/datastream_zmq.cpp b/plotjuggler_plugins/DataStreamZMQ/datastream_zmq.cpp index 113a93b6a..23bb3f628 100644 --- a/plotjuggler_plugins/DataStreamZMQ/datastream_zmq.cpp +++ b/plotjuggler_plugins/DataStreamZMQ/datastream_zmq.cpp @@ -2,6 +2,7 @@ #include "ui_datastream_zmq.h" #include "PlotJuggler/messageparser_base.h" +#include "PlotJuggler/dialog_utils.h" #include #include #include @@ -106,7 +107,7 @@ bool DataStreamZMQ::start(QStringList*) dialog->ui->lineEditTopics->setText(topics); connect(dialog->ui->comboBoxProtocol, qOverload(&QComboBox::currentIndexChanged), - this, [&](const QString& selected_protocol) { + this, [this, dialog](const QString& selected_protocol) { if (_parser_creator) { if (auto prev_widget = _parser_creator->optionsWidget()) @@ -120,6 +121,8 @@ bool DataStreamZMQ::start(QStringList*) { widget->setVisible(true); } + + adjustDialogToContent(dialog, selected_protocol); }); dialog->ui->comboBoxProtocol->setCurrentText(protocol);