@@ -29,6 +29,33 @@ def __lt__(self, other):
2929 return self .secs < other .secs
3030
3131
32+ class ElidedLabel (QLabel ):
33+ def __init__ (self , parent = None , mode = Qt .ElideRight ):
34+ super ().__init__ (parent )
35+ self ._mode = mode
36+ self ._full_text = ''
37+ self .setWordWrap (False )
38+ self .setTextInteractionFlags (Qt .NoTextInteraction )
39+ self .setMinimumWidth (0 )
40+ self .setSizePolicy (QSizePolicy .Ignored , QSizePolicy .Preferred )
41+
42+ def setText (self , text : str ):
43+ self ._full_text = text
44+ self ._update_elide ()
45+
46+ def resizeEvent (self , event ):
47+ super ().resizeEvent (event )
48+ self ._update_elide ()
49+
50+ def _update_elide (self ):
51+ w = self .width ()
52+ if w > 0 :
53+ fm = self .fontMetrics ()
54+ super ().setText (fm .elidedText (self ._full_text , self ._mode , w ))
55+ else :
56+ super ().setText (self ._full_text )
57+
58+
3259class MainWindow (QMainWindow ):
3360 SUPPORTED_INPUT_FILTERS = QMainWindow .tr ('文本文件(*.txt);;所有文件(*.*)' )
3461 SUPPORTED_OUTPUT_FILTERS = QMainWindow .tr ('文本文件(*.txt);;CSV 表格(*.csv);;所有文件(*.*)' )
@@ -68,6 +95,10 @@ def __init__(self, parent=None):
6895 # clipboard
6996 self .clipboard = QApplication .clipboard ()
7097
98+ # status bar
99+ self .ui .statusbar .setContentsMargins (9 , 0 , 9 , 0 )
100+ self .ui .statusbar .setStyleSheet ('QStatusBar::item { border: none; }' )
101+
71102 # settings
72103 self .ui .actResetSettings .triggered .connect (self ._reset_settings )
73104 self .settings = QSettings ('GoodCoder666' , 'IPFinder' )
@@ -280,15 +311,15 @@ def _set_buttons_enabled(self, enabled):
280311 self .ui .btnWait_Test .setEnabled (enabled )
281312
282313 def _init_progessBar (self , prog_max ):
283- self .progressBar = QProgressBar (self )
284- self .progressBar .setFixedWidth (390 )
314+ self .progressBar = QProgressBar (self .ui .statusbar )
285315 self .progressBar .setRange (0 , prog_max )
286316 self .progressBar .setValue (0 )
287- self .logLabel = QLabel (self )
288- self .logLabel .setMaximumWidth (370 )
317+ self .progressBar .setMaximumHeight (18 )
318+ self .logLabel = ElidedLabel (self .ui .statusbar )
319+ self .logLabel .setAlignment (Qt .AlignCenter )
289320 self .ui .statusbar .clearMessage ()
290- self .ui .statusbar .addWidget (self .progressBar )
291- self .ui .statusbar .addWidget (self .logLabel )
321+ self .ui .statusbar .addWidget (self .progressBar , 1 )
322+ self .ui .statusbar .addWidget (self .logLabel , 1 )
292323
293324 def _update_progressBar (self , dt = 1 ):
294325 self .progressBar .setValue (self .progressBar .value () + dt )
@@ -301,21 +332,21 @@ def _remove_progessBar(self):
301332 self .progressBar .deleteLater ()
302333 self .logLabel .deleteLater ()
303334
304- def _add_result (self , ip , seconds ):
335+ def _add_result (self , ip , latency ):
305336 self .ui .resultTable .setSortingEnabled (False ) # TODO: maybe there's a better way to temporarily disable sorting?
306337
307338 row = self .ui .resultTable .rowCount ()
308339 self .ui .resultTable .setRowCount (row + 1 )
309340 self .ui .resultTable .setItem (row , 0 , QTableWidgetItem (ip ))
310- time_str = time_repr (seconds )
311- self .ui .resultTable .setItem (row , 1 , QTableWidgetTimeItem (seconds , time_str ))
341+ time_str = time_repr (latency )
342+ self .ui .resultTable .setItem (row , 1 , QTableWidgetTimeItem (latency , time_str ))
312343 self .logLabel .setText (self .tr ('发现可用IP: %s [%s]' ) % (ip , time_str ))
313344 self ._update_progressBar ()
314345
315346 self .ui .resultTable .setSortingEnabled (True )
316347
317348 def _found_unavailable (self , ip , reason ):
318- self .logLabel .setText (self .tr ('IP %s 不可用 [原因: %s]' ) % (ip , reason ))
349+ self .logLabel .setText (self .tr ('IP %s 不可用 [%s]' ) % (ip , reason ))
319350 self ._update_progressBar ()
320351
321352 def _speedtest_finished (self ):
@@ -327,20 +358,21 @@ def _test_ips(self, after_scan=True):
327358 self .ui .resultTable .setRowCount (0 )
328359 ips = [self .ui .ipList .item (i ).text () for i in range (self .ui .ipList .count ())]
329360 if after_scan :
330- self .progressBar .setValue (0 )
331361 self .progressBar .setMaximum (len (ips ))
362+ self .progressBar .setValue (0 )
363+ self .logLabel .setText (self .tr ('扫描完成,开始测速...' ))
332364 self .ui .btnWait_Scan .setText (self .tr ('扫描' ))
333365 self .ui .btnWait_Scan .setEnabled (False )
334366 else :
335367 self ._init_progessBar (len (ips ))
336368 thread = SpeedtestThread (self , ips ,
337369 host = self .settings .value ('test/host' ),
338370 request_format = self .settings .value ('test/template' ),
339- available_callback = self ._add_result ,
340- unavailable_callback = self ._found_unavailable ,
341371 timeout = self .settings .value ('test/timeout' , type = float ),
342372 repeat = self .settings .value ('test/repeat' , type = int ),
343373 num_workers = self .settings .value ('test/num_threads' , type = int ))
374+ thread .foundAvailable .connect (self ._add_result )
375+ thread .foundUnavailable .connect (self ._found_unavailable )
344376 thread .finished .connect (self ._speedtest_finished )
345377 thread .start ()
346378
@@ -349,9 +381,9 @@ def on_btnWait_Test_clicked(self):
349381 self ._set_buttons_enabled (False )
350382 self ._test_ips (False )
351383
352- def _report_single_scan_result (self , ip ):
384+ def _report_single_scan_result (self , ip , latency ):
353385 self .ui .ipList .addItem (QListWidgetItem (ip ))
354- self .logLabel .setText (self .tr ('发现可用IP: %s' ) % ip )
386+ self .logLabel .setText (self .tr ('发现可用IP: %s [%s] ' ) % ( ip , time_repr ( latency )) )
355387
356388 def _after_scan (self ):
357389 self ._set_buttons_enabled (True )
@@ -368,6 +400,9 @@ def on_btnWait_Scan_clicked(self):
368400
369401 dlg = dlgScan (self , self .settings .value ('scan/ranges' ))
370402 if dlg .exec () == QDialog .Accepted :
403+ # TODO: add separate host/template settings for scan?
404+ host = self .settings .value ('test/host' )
405+ request_format = self .settings .value ('test/template' )
371406 max_ips = dlg .ui .spinBox_MaxIP .value ()
372407 num_workers = int (dlg .ui .comboBox_threads .currentText ())
373408 timeout = dlg .ui .spinBox_timeout .value ()
@@ -394,13 +429,13 @@ def on_btnWait_Scan_clicked(self):
394429 self ._set_buttons_enabled (False )
395430 self .ui .ipList .clear ()
396431
397- thread = ScanThread (self , ip_networks , max_ips , num_workers , timeout , randomized )
432+ thread = ScanThread (self , ip_networks , host , request_format ,
433+ max_ips , num_workers , timeout , randomized )
398434 thread .finished .connect (self ._test_ips if autoTest else self ._after_scan )
399435 thread .foundAvailable .connect (self ._report_single_scan_result )
400436 thread .progressUpdate .connect (self ._scan_update )
401- total_addrs = sum (map (len , thread .networks ))
402- self ._init_progessBar (total_addrs )
403- self .logLabel .setText (self .tr ('开始扫描,共 %n 个 IP...' , '' , total_addrs ))
437+ self ._init_progessBar (thread .total_ips )
438+ self .logLabel .setText (self .tr ('开始扫描,共 %n 个 IP...' , '' , thread .total_ips ))
404439 thread .start ()
405440
406441 self .sthread = thread
0 commit comments