@@ -13,31 +13,66 @@ MenuConnect::MenuConnect(MenuType type, ModbusMultiServer& server, QWidget *pare
1313 ,_menuType(type)
1414 ,_mbMultiServer(server)
1515{
16- addAction (tr (" Modbus/TCP Srv" ), ConnectionType::Tcp, QString ());
17-
18- for (auto && port: getAvailableSerialPorts ())
16+ if (type == MenuType::ConnectMenu)
1917 {
20- const auto text = QString (tr (" Port %1" )).arg (port);
21- addAction (text, ConnectionType::Serial, port);
18+ addAction (tr (" Modbus/TCP Srv" ), ConnectionType::Tcp, QString ());
19+ for (auto && port: getAvailableSerialPorts ())
20+ {
21+ const auto text = QString (tr (" Port %1" )).arg (port);
22+ addAction (text, ConnectionType::Serial, port);
23+ }
2224 }
2325
24- connect (&_mbMultiServer, &ModbusMultiServer::connected, this , [&](const ConnectionDetails&)
26+ connect (&_mbMultiServer, &ModbusMultiServer::connected, this , [&](const ConnectionDetails& cd )
2527 {
26- for ( auto && a : actions () )
28+ if (_menuType == MenuType::DisconnectMenu )
2729 {
28- const auto data = a->data ().value <QPair<ConnectionType, QString>>();
29- const bool isConnected = _mbMultiServer.isConnected (data.first , data.second );
30- a->setEnabled (_menuType == ConnectMenu ? !isConnected : isConnected);
30+ switch (cd.Type )
31+ {
32+ case ConnectionType::Tcp:
33+ {
34+ const auto port = QString (" %1:%2" ).arg (cd.TcpParams .IPAddress , QString::number (cd.TcpParams .ServicePort ));
35+ addAction (QString (tr (" Modbus/TCP Srv %1" )).arg (port), ConnectionType::Tcp, port);
36+ }
37+ break ;
38+
39+ case ConnectionType::Serial:
40+ addAction (QString (tr (" Port %1" )).arg (cd.SerialParams .PortName ), ConnectionType::Serial, cd.SerialParams .PortName );
41+ break ;
42+ }
43+ }
44+ else
45+ {
46+ for (auto && a : actions ())
47+ {
48+ const auto data = a->data ().value <QPair<ConnectionType, QString>>();
49+ const bool isConnected = _mbMultiServer.isConnected (data.first , data.second );
50+ a->setEnabled (_menuType == ConnectMenu ? !isConnected : isConnected);
51+ }
3152 }
3253 });
3354
34- connect (&_mbMultiServer, &ModbusMultiServer::disconnected, this , [&](const ConnectionDetails&)
55+ connect (&_mbMultiServer, &ModbusMultiServer::disconnected, this , [&](const ConnectionDetails& cd )
3556 {
3657 for (auto && a : actions ())
3758 {
3859 const auto data = a->data ().value <QPair<ConnectionType, QString>>();
39- const bool isConnected = _mbMultiServer.isConnected (data.first , data.second );
40- a->setEnabled (_menuType == ConnectMenu ? !isConnected : isConnected);
60+ if (_menuType == MenuType::DisconnectMenu)
61+ {
62+ const auto port = (data.first == ConnectionType::Tcp) ?
63+ QString (" %1:%2" ).arg (cd.TcpParams .IPAddress , QString::number (cd.TcpParams .ServicePort )) :
64+ cd.SerialParams .PortName ;
65+
66+ if (data.first == cd.Type && data.second == port)
67+ {
68+ removeAction (a);
69+ }
70+ }
71+ else
72+ {
73+ const bool isConnected = _mbMultiServer.isConnected (data.first , data.second );
74+ a->setEnabled (_menuType == ConnectMenu ? !isConnected : isConnected);
75+ }
4176 }
4277 });
4378}
@@ -79,7 +114,7 @@ bool MenuConnect::canConnect(const ConnectionDetails& cd)
79114 {
80115 if (c.Type != cd.Type ) continue ;
81116 if (c.Type == ConnectionType::Tcp ||
82- (c.Type == ConnectionType::Serial && c.SerialParams .PortName == cd.SerialParams .PortName ))
117+ (c.Type == ConnectionType::Serial && c.SerialParams .PortName == cd.SerialParams .PortName ))
83118 {
84119 return true ;
85120 }
@@ -140,5 +175,4 @@ void MenuConnect::addAction(const QString& text, ConnectionType type, const QStr
140175
141176 const auto data = QPair<ConnectionType, QString>(type, port);
142177 action->setData (QVariant::fromValue (data));
143- action->setEnabled (_menuType == ConnectMenu);
144178}
0 commit comments