Skip to content

Commit 294d123

Browse files
committed
add connection status hint in tab
1 parent 658cec5 commit 294d123

File tree

9 files changed

+73
-13
lines changed

9 files changed

+73
-13
lines changed

COMTool/conn/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class COMM(QObject):
1717
onInit
1818
onWidget
1919
onUiInitDone
20-
isConnected
20+
isConnected or getConnStatus
2121
send
2222
getConfig
2323
onDel
@@ -58,6 +58,9 @@ def send(self, data : bytes):
5858
def isConnected(self):
5959
raise NotImplementedError()
6060

61+
def getConnStatus(self):
62+
raise NotImplementedError()
63+
6164
def disconnect(self):
6265
raise NotImplementedError()
6366

COMTool/conn/conn_serial.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Serial(COMM):
3939
onInit
4040
onWidget
4141
onUiInitDone
42-
isConnected
42+
isConnected or getConnStatus
4343
send
4444
getConfig
4545
'''
@@ -461,6 +461,7 @@ def receiveDataProcess(self):
461461
except Exception:
462462
pass
463463
waitingReconnect = True
464+
self.status = ConnectionStatus.LOSE
464465
self.onConnectionStatus.emit(ConnectionStatus.LOSE, _("Connection lose!"))
465466
self.showSwitchSignal.emit(ConnectionStatus.LOSE)
466467

@@ -469,7 +470,10 @@ def send(self, data : bytes):
469470
self.com.write(data)
470471

471472
def isConnected(self):
472-
return self.status == ConnectionStatus.CONNECTED
473+
return (self.status == ConnectionStatus.CONNECTED) or (self.status == ConnectionStatus.LOSE)
474+
475+
def getConnStatus(self):
476+
return self.status
473477

474478
if __name__ == "__main__":
475479
from PyQt5.QtWidgets import QApplication

COMTool/conn/conn_ssh.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ def isConnected(self):
6565
return False
6666
return not self.channel.closed
6767

68+
def getConnStatus(self):
69+
if not self.channel:
70+
return ConnectionStatus.DISCONNECTED
71+
if self.channel.closed:
72+
return ConnectionStatus.DISCONNECTED
73+
return ConnectionStatus.CONNECTED
74+
6875
def resize(self, w, h):
6976
if self.channel:
7077
self.channel.resize_pty(width=w, height=h)
@@ -76,7 +83,7 @@ class SSH(COMM):
7683
onInit
7784
onWidget
7885
onUiInitDone
79-
isConnected
86+
isConnected or getConnStatus
8087
send
8188
getConfig
8289
'''
@@ -415,6 +422,9 @@ def send(self, data : bytes):
415422
def isConnected(self):
416423
return self.status == ConnectionStatus.CONNECTED
417424

425+
def getConnStatus(self):
426+
return self.status
427+
418428
def ctrl(self, k, v):
419429
if not self.conn:
420430
return

COMTool/conn/conn_tcp_udp.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TCP_UDP(COMM):
3333
onInit
3434
onWidget
3535
onUiInitDone
36-
isConnected
36+
isConnected or getConnStatus
3737
send
3838
getConfig
3939
'''
@@ -597,3 +597,6 @@ def send(self, data : bytes):
597597
def isConnected(self):
598598
return self.status == ConnectionStatus.CONNECTED
599599

600+
def getConnStatus(self):
601+
return self.status
602+

COMTool/main2.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ def addItem(self, pluginClass, nameSaved = None, setCurrent = False, connsConfig
191191
item = PluginItem(name, pluginClass,
192192
conns, connsConfigs,
193193
self.config, pluginConfig,
194-
self.hintSignal, self.reloadWindowSignal)
194+
self.hintSignal, self.reloadWindowSignal,
195+
self.onConnChnaged)
195196
self.tabAddItem(item)
196197
self.items.append(item)
197198
if setCurrent:
@@ -211,6 +212,23 @@ def tabAddItem(self, item):
211212
self.tabWidget.addTab(item.widget, item.name)
212213
self.tabWidget.setTabToolTip(self.tabWidget.count() - 1, item.name + _(", Double click to detach as a window"))
213214

215+
def onConnChnaged(self, plugin, status:ConnectionStatus, msg):
216+
for item in self.items:
217+
if item.plugin == plugin:
218+
for i in range(self.tabWidget.count()):
219+
if self.tabWidget.widget(i) == item.widget:
220+
self.setTabIcon(status, i)
221+
break
222+
item.widget.setWindowTitle(item.name + " - {}".format(_("Connected" if status == ConnectionStatus.CONNECTED else _("Connection lose") if status == ConnectionStatus.LOSE else _("Disconnected"))))
223+
224+
def setTabIcon(self, status:ConnectionStatus, i:int):
225+
if status == ConnectionStatus.CONNECTED:
226+
self.tabWidget.setTabIcon(i, qta.icon("fa.circle", color="#4caf50"))
227+
elif status == ConnectionStatus.LOSE:
228+
self.tabWidget.setTabIcon(i, qta.icon("fa.circle", color="orange"))
229+
else:
230+
self.tabWidget.setTabIcon(i, QIcon())
231+
214232
def addPluginInfo(self, pluginClass):
215233
self.pluginsSelector.insertItem(self.pluginsSelector.count() - 1,
216234
f'{pluginClass.name} - {pluginClass.id}')
@@ -459,11 +477,19 @@ def onTabDoubleClicked(self, idx):
459477

460478
def recoverTab(self, item, parent):
461479
# prevent close and add this widget to tab
462-
for i, _item in enumerate(self.items):
463-
if _item == item:
480+
idx = self.items.index(item)
481+
for i in range(self.tabWidget.count()):
482+
widget = self.tabWidget.widget(i)
483+
for _item in self.items:
484+
if _item.widget == widget:
485+
idx2 = self.items.index(_item)
486+
break
487+
if idx2 > idx:
464488
self.tabWidget.insertTab(i, item.widget, item.name)
465489
self.tabWidget.setCurrentIndex(i)
466490
item.widget.setWindowFlag(Qt.Window, False)
491+
status = item.plugin.getConnStatus()
492+
self.setTabIcon(status, i)
467493
break
468494

469495

@@ -567,10 +593,12 @@ def keyReleaseEvent(self,event):
567593
item = self.getCurrentItem()
568594
item.onKeyReleaseEvent(event)
569595

570-
def getCurrentItem(self):
596+
def getCurrentItem(self, idx = False):
571597
widget = self.tabWidget.currentWidget()
572598
for item in self.items:
573599
if item.widget == widget:
600+
if idx:
601+
return self.tabWidget.indexOf(widget), item
574602
return item
575603

576604
def toggleSettings(self):

COMTool/pluginItems.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
try:
1313
from i18n import _
1414
from Combobox import ComboBox
15+
from conn import ConnectionStatus, conns
1516
from parameters import log, configFilePath
1617
except ImportError:
1718
from COMTool.Combobox import ComboBox
19+
from COMTool.conn import ConnectionStatus, conns
1820
from COMTool.i18n import _
1921
from COMTool.parameters import log, configFilePath
2022

@@ -25,7 +27,8 @@ class PluginItem:
2527
def __init__(self, name, pluginClass,
2628
connClasses, connsConfigs,
2729
globalConfig, itemConfig,
28-
hintSignal, reloadWindowSignal):
30+
hintSignal, reloadWindowSignal,
31+
connCallback):
2932
'''
3033
item show name, e.g. dbg-1
3134
'''
@@ -50,6 +53,7 @@ def __init__(self, name, pluginClass,
5053
self.plugin.ctrlConn = self.ctrlConn
5154
self.plugin.hintSignal = self.hintSignal
5255
self.plugin.reloadWindowSignal = self.reloadWindowSignal
56+
self.plugin.connCallbak = connCallback
5357
self.plugin.onInit(config=itemConfig)
5458
if not "version" in itemConfig:
5559
raise Exception("{} {}".format(_("version not found in config of plugin:"), self.plugin.id))
@@ -203,6 +207,7 @@ def _setConn(self, idx):
203207
self.connsParent.layout().addWidget(self.currConnWidget)
204208
self.conns[idx].onReceived = self.onReceived
205209
self.plugin.isConnected = self.conns[idx].isConnected
210+
self.plugin.getConnStatus = self.conns[idx].getConnStatus
206211
self.conns[idx].onConnectionStatus.connect(self.onConnStatus)
207212
self.connsConfigs["currConn"] = self.conns[idx].id
208213
self.currConnIdx = idx
@@ -223,11 +228,12 @@ def initEvent(self):
223228
def onConnChanged(self, idx):
224229
self.conns[self.currConnIdx].disconnect()
225230
self._setConn(idx)
231+
self.onConnStatus(ConnectionStatus.CLOSED, _("Change connection, auto close old connection"))
226232

227233
def ctrlConn(self, k, v):
228234
self.conns[self.currConnIdx].ctrl(k, v)
229235

230-
def onConnStatus(self, status, msg):
236+
def onConnStatus(self, status:ConnectionStatus, msg):
231237
self.plugin.onConnChanged(status, msg)
232238
if self.sendProcess is None:
233239
self.sendProcess = threading.Thread(target=self.sendDataProcess)

COMTool/plugins/base.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ class Plugin_Base(QObject):
2424
onWidget
2525
onUiInitDone
2626
onActive
27-
send
28-
onReceived
27+
onConnChanged -> connCallbak # in UI thread
28+
send # can call in UI thread directly
29+
onReceived # in receive thread
2930
onDel
3031
'''
3132
# vars set by caller
3233
isConnected = lambda o: False
34+
getConnStatus = lambda o: ConnectionStatus.CLOSED
35+
connCallbak = lambda status,msg:None
3336
send = lambda o,x,y:None # send(data_bytes=None, file_path=None, callback=lambda ok,msg:None), can call in UI thread directly
3437
ctrlConn = lambda o,k,v:None # call ctrl func of connection
3538
hintSignal = None # hintSignal.emit(type(error, warning, info), title, msg)
@@ -82,6 +85,7 @@ def onConnChanged(self, status:ConnectionStatus, msg:str):
8285
self.statusBar.setMsg("warning", '{} {}'.format(_("Connection lose"), msg))
8386
else:
8487
self.statusBar.setMsg("warning", msg)
88+
self.connCallbak(self, status, msg)
8589

8690
def onWidgetMain(self, parent):
8791
'''

COMTool/plugins/myplugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class Plugin(Plugin_Base):
2323
updateSignal = pyqtSignal(str, str)
2424

2525
def onConnChanged(self, status:ConnectionStatus, msg:str):
26+
super().onConnChanged(status, msg)
2627
print("-- connection changed: {}, msg: {}".format(status, msg))
2728

2829
def onWidgetMain(self, parent):

COMTool/plugins/myplugin2/comtool_plugin_myplugin2/myplugin2.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class Plugin(Plugin_Base):
3131
updateSignal = pyqtSignal(str, str)
3232

3333
def onConnChanged(self, status:ConnectionStatus, msg:str):
34+
super().onConnChanged(status, msg)
3435
print("-- connection changed: {}, msg: {}".format(status, msg))
3536

3637
def onWidgetMain(self, parent):

0 commit comments

Comments
 (0)