@@ -15,11 +15,16 @@ MenuConnect::MenuConnect(MenuType type, ModbusMultiServer& server, QWidget *pare
1515{
1616 if (_menuType == MenuType::ConnectMenu)
1717 {
18- addAction (tr (" Modbus/TCP Srv" ), ConnectionType::Tcp, QString (), " Modbus/TCP Srv" );
19- for (auto && port: getAvailableSerialPorts ())
20- {
21- const auto text = QString (tr (" Port %1" )).arg (port);
22- addAction (text, ConnectionType::Serial, port, QString (" Port %1" ).arg (port));
18+ addAction (this , tr (" Modbus/TCP Srv" ), ConnectionType::Tcp, QString (), " Modbus/TCP Srv" );
19+
20+ const auto availablePorts = getAvailableSerialPorts ();
21+ if (!availablePorts.isEmpty ()) {
22+ auto serialMenu = new QMenu (tr (" Modbus/RTU Srv" ), parent);
23+ for (auto && port: availablePorts) {
24+ const auto text = QString (tr (" Port %1" )).arg (port);
25+ addAction (serialMenu, text, ConnectionType::Serial, port, QString (" Port %1" ).arg (port));
26+ }
27+ addMenu (serialMenu);
2328 }
2429 }
2530
@@ -32,18 +37,18 @@ MenuConnect::MenuConnect(MenuType type, ModbusMultiServer& server, QWidget *pare
3237 case ConnectionType::Tcp:
3338 {
3439 const auto port = QString (" %1:%2" ).arg (cd.TcpParams .IPAddress , QString::number (cd.TcpParams .ServicePort ));
35- addAction (tr (" Modbus/TCP Srv %1" ).arg (port), ConnectionType::Tcp, port, QString (" Modbus/TCP Srv %1" ).arg (port));
40+ addAction (this , tr (" Modbus/TCP Srv %1" ).arg (port), ConnectionType::Tcp, port, QString (" Modbus/TCP Srv %1" ).arg (port));
3641 }
3742 break ;
3843
3944 case ConnectionType::Serial:
40- addAction (tr (" Port %1" ).arg (cd.SerialParams .PortName ), ConnectionType::Serial, cd.SerialParams .PortName , QString (" Port %1" ).arg (cd.SerialParams .PortName ));
45+ addAction (this , tr (" Port %1" ).arg (cd.SerialParams .PortName ), ConnectionType::Serial, cd.SerialParams .PortName , QString (" Port %1" ).arg (cd.SerialParams .PortName ));
4146 break ;
4247 }
4348 }
4449 else
4550 {
46- for (auto && a : actions ())
51+ for (auto && a : actions (this ))
4752 {
4853 const auto data = a->data ().value <QPair<ConnectionType, QString>>();
4954 const bool isConnected = _mbMultiServer.isConnected (data.first , data.second );
@@ -54,7 +59,7 @@ MenuConnect::MenuConnect(MenuType type, ModbusMultiServer& server, QWidget *pare
5459
5560 connect (&_mbMultiServer, &ModbusMultiServer::disconnected, this , [&](const ConnectionDetails& cd)
5661 {
57- for (auto && a : actions ())
62+ for (auto && a : actions (this ))
5863 {
5964 const auto data = a->data ().value <QPair<ConnectionType, QString>>();
6065 if (_menuType == MenuType::DisconnectMenu)
@@ -85,7 +90,7 @@ void MenuConnect::changeEvent(QEvent* event)
8590{
8691 if (event->type () == QEvent::LanguageChange)
8792 {
88- for (auto && a : actions ())
93+ for (auto && a : actions (this ))
8994 {
9095 const auto data = a->data ().value <QPair<ConnectionType, QString>>();
9196 switch (data.first )
@@ -149,16 +154,38 @@ void MenuConnect::updateConnectionDetails(const QList<ConnectionDetails>& conns)
149154 }
150155}
151156
157+ // /
158+ // / \brief MenuConnect::actions
159+ // / \param menu
160+ // / \return
161+ // /
162+ QList<QAction*> MenuConnect::actions (const QMenu* menu) const
163+ {
164+ QList<QAction*> listActions;
165+ for (auto a: menu->actions ())
166+ {
167+ if (auto * subMenu = a->menu ()) {
168+ listActions.append (actions (subMenu));
169+ }
170+ else {
171+ listActions.append (a);
172+ }
173+ }
174+
175+ return listActions;
176+ }
177+
152178// /
153179// / \brief MenuConnect::addAction
180+ // / \param menu
154181// / \param text
155182// / \param type
156183// / \param port
157184// / \param id
158185// /
159- void MenuConnect::addAction (const QString& text, ConnectionType type, const QString& port, const QString& id)
186+ void MenuConnect::addAction (QMenu* menu, const QString& text, ConnectionType type, const QString& port, const QString& id)
160187{
161- auto action = QMenu:: addAction (text);
188+ auto action = menu-> addAction (text);
162189 connect (action, &QAction::triggered, this , [this , action, type, port]
163190 {
164191 if (_menuType == ConnectMenu)
0 commit comments