not1mm 25.3.19.1__py3-none-any.whl → 25.3.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- not1mm/__main__.py +51 -2
- not1mm/data/main.ui +19 -2
- not1mm/data/statistics.ui +47 -0
- not1mm/lib/version.py +1 -1
- not1mm/statistics.py +183 -0
- {not1mm-25.3.19.1.dist-info → not1mm-25.3.24.dist-info}/METADATA +6 -3
- {not1mm-25.3.19.1.dist-info → not1mm-25.3.24.dist-info}/RECORD +11 -9
- {not1mm-25.3.19.1.dist-info → not1mm-25.3.24.dist-info}/WHEEL +1 -1
- {not1mm-25.3.19.1.dist-info → not1mm-25.3.24.dist-info}/entry_points.txt +0 -0
- {not1mm-25.3.19.1.dist-info → not1mm-25.3.24.dist-info/licenses}/LICENSE +0 -0
- {not1mm-25.3.19.1.dist-info → not1mm-25.3.24.dist-info}/top_level.txt +0 -0
not1mm/__main__.py
CHANGED
@@ -68,6 +68,7 @@ from not1mm.checkwindow import CheckWindow
|
|
68
68
|
from not1mm.bandmap import BandMapWindow
|
69
69
|
from not1mm.vfo import VfoWindow
|
70
70
|
from not1mm.ratewindow import RateWindow
|
71
|
+
from not1mm.statistics import StatsWindow
|
71
72
|
from not1mm.radio import Radio
|
72
73
|
from not1mm.voice_keying import Voice
|
73
74
|
from not1mm.lookupservice import LookupService
|
@@ -132,6 +133,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
132
133
|
"checkwindow": False,
|
133
134
|
"vfowindow": False,
|
134
135
|
"ratewindow": False,
|
136
|
+
"statisticswindow": False,
|
135
137
|
"darkmode": True,
|
136
138
|
}
|
137
139
|
appstarted = False
|
@@ -177,6 +179,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
177
179
|
bandmap_window = None
|
178
180
|
vfo_window = None
|
179
181
|
rate_window = None
|
182
|
+
statistics_window = None
|
183
|
+
settings = None
|
180
184
|
lookup_service = None
|
181
185
|
fldigi_util = None
|
182
186
|
rtc_service = None
|
@@ -238,6 +242,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
238
242
|
self.actionBandmap.triggered.connect(self.launch_bandmap_window)
|
239
243
|
self.actionCheck_Window.triggered.connect(self.launch_check_window)
|
240
244
|
self.actionRate_Window.triggered.connect(self.launch_rate_window)
|
245
|
+
self.actionStatistics.triggered.connect(self.launch_stats_window)
|
241
246
|
self.actionVFO.triggered.connect(self.launch_vfo)
|
242
247
|
self.actionRecalculate_Mults.triggered.connect(self.recalculate_mults)
|
243
248
|
self.actionLoad_Call_History_File.triggered.connect(self.load_call_history)
|
@@ -249,7 +254,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
249
254
|
lambda x: self.generate_cabrillo("utf-8")
|
250
255
|
)
|
251
256
|
self.actionGenerate_ADIF.triggered.connect(self.generate_adif)
|
252
|
-
self.
|
257
|
+
self.actionGenerate_EDI.triggered.connect(self.generate_edi)
|
253
258
|
|
254
259
|
self.actionConfiguration_Settings.triggered.connect(
|
255
260
|
self.edit_configuration_settings
|
@@ -654,6 +659,17 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
654
659
|
self.rate_window.hide()
|
655
660
|
self.rate_window.message.connect(self.dockwidget_message)
|
656
661
|
|
662
|
+
self.show_splash_msg("Setting up StatisticsWindow.")
|
663
|
+
self.statistics_window = StatsWindow()
|
664
|
+
self.statistics_window.setObjectName("statistics-window")
|
665
|
+
if os.environ.get("WAYLAND_DISPLAY") and old_Qt is True:
|
666
|
+
self.statistics_window.setFeatures(dockfeatures)
|
667
|
+
self.addDockWidget(
|
668
|
+
Qt.DockWidgetArea.RightDockWidgetArea, self.statistics_window
|
669
|
+
)
|
670
|
+
self.statistics_window.hide()
|
671
|
+
self.statistics_window.message.connect(self.dockwidget_message)
|
672
|
+
|
657
673
|
self.show_splash_msg("Setting up VFOWindow.")
|
658
674
|
self.vfo_window = VfoWindow()
|
659
675
|
self.vfo_window.setObjectName("vfo-window")
|
@@ -714,6 +730,15 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
714
730
|
self.rate_window.hide()
|
715
731
|
self.rate_window.setActive(False)
|
716
732
|
|
733
|
+
self.actionStatistics.setChecked(self.pref.get("statisticswindow", False))
|
734
|
+
if self.actionStatistics.isChecked():
|
735
|
+
self.statistics_window.show()
|
736
|
+
self.statistics_window.setActive(True)
|
737
|
+
self.statistics_window.get_run_and_total_qs()
|
738
|
+
else:
|
739
|
+
self.statistics_window.hide()
|
740
|
+
self.statistics_window.setActive(False)
|
741
|
+
|
717
742
|
self.actionVFO.setChecked(self.pref.get("vfowindow", False))
|
718
743
|
if self.actionVFO.isChecked():
|
719
744
|
self.vfo_window.show()
|
@@ -990,6 +1015,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
990
1015
|
self.vfo_window.msg_from_main(cmd)
|
991
1016
|
if self.rate_window:
|
992
1017
|
self.rate_window.msg_from_main(cmd)
|
1018
|
+
if self.statistics_window:
|
1019
|
+
self.statistics_window.msg_from_main(cmd)
|
993
1020
|
|
994
1021
|
if setdarkmode:
|
995
1022
|
darkPalette = QPalette()
|
@@ -1331,6 +1358,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1331
1358
|
self.log_window.msg_from_main(cmd)
|
1332
1359
|
if self.rate_window:
|
1333
1360
|
self.rate_window.msg_from_main(cmd)
|
1361
|
+
if self.statistics_window:
|
1362
|
+
self.statistics_window.msg_from_main(cmd)
|
1363
|
+
|
1334
1364
|
self.clearinputs()
|
1335
1365
|
self.edit_station_settings()
|
1336
1366
|
|
@@ -1370,6 +1400,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1370
1400
|
self.log_window.msg_from_main(cmd)
|
1371
1401
|
if self.rate_window:
|
1372
1402
|
self.rate_window.msg_from_main(cmd)
|
1403
|
+
if self.statistics_window:
|
1404
|
+
self.statistics_window.msg_from_main(cmd)
|
1405
|
+
|
1373
1406
|
self.clearinputs()
|
1374
1407
|
self.open_contest()
|
1375
1408
|
|
@@ -1662,6 +1695,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1662
1695
|
self.log_window.msg_from_main(cmd)
|
1663
1696
|
if self.rate_window:
|
1664
1697
|
self.rate_window.msg_from_main(cmd)
|
1698
|
+
if self.statistics_window:
|
1699
|
+
self.statistics_window.msg_from_main(cmd)
|
1700
|
+
|
1665
1701
|
if hasattr(self.contest, "columns"):
|
1666
1702
|
cmd = {}
|
1667
1703
|
cmd["cmd"] = "SHOWCOLUMNS"
|
@@ -1884,6 +1920,17 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1884
1920
|
self.rate_window.hide()
|
1885
1921
|
self.rate_window.setActive(False)
|
1886
1922
|
|
1923
|
+
def launch_stats_window(self) -> None:
|
1924
|
+
"""Launch the check window"""
|
1925
|
+
self.pref["statisticswindow"] = self.actionStatistics.isChecked()
|
1926
|
+
self.write_preference()
|
1927
|
+
if self.actionStatistics.isChecked():
|
1928
|
+
self.statistics_window.show()
|
1929
|
+
self.statistics_window.setActive(True)
|
1930
|
+
else:
|
1931
|
+
self.statistics_window.hide()
|
1932
|
+
self.statistics_window.setActive(False)
|
1933
|
+
|
1887
1934
|
def launch_vfo(self) -> None:
|
1888
1935
|
"""Launch the VFO window"""
|
1889
1936
|
self.pref["vfowindow"] = self.actionVFO.isChecked()
|
@@ -2535,6 +2582,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2535
2582
|
self.log_window.msg_from_main(cmd)
|
2536
2583
|
if self.check_window:
|
2537
2584
|
self.check_window.msg_from_main(cmd)
|
2585
|
+
if self.statistics_window:
|
2586
|
+
self.statistics_window.msg_from_main(cmd)
|
2538
2587
|
|
2539
2588
|
def update_rtc_xml(self):
|
2540
2589
|
"""Update RTC XML"""
|
@@ -3332,7 +3381,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3332
3381
|
if "ARRL Sweepstakes" in self.contest.name:
|
3333
3382
|
self.contest.parse_exchange(self)
|
3334
3383
|
return
|
3335
|
-
if hasattr(self.contest, "call_parse_exchange_on_edit"):
|
3384
|
+
if hasattr(self.contest, "call_parse_exchange_on_edit"):
|
3336
3385
|
if self.contest.advance_on_space:
|
3337
3386
|
self.contest.parse_exchange(self)
|
3338
3387
|
if hasattr(self.contest, "advance_on_space"):
|
not1mm/data/main.ui
CHANGED
@@ -1511,10 +1511,11 @@
|
|
1511
1511
|
<property name="title">
|
1512
1512
|
<string>Window</string>
|
1513
1513
|
</property>
|
1514
|
-
<addaction name="actionLog_Window"/>
|
1515
1514
|
<addaction name="actionBandmap"/>
|
1516
1515
|
<addaction name="actionCheck_Window"/>
|
1516
|
+
<addaction name="actionLog_Window"/>
|
1517
1517
|
<addaction name="actionRate_Window"/>
|
1518
|
+
<addaction name="actionStatistics"/>
|
1518
1519
|
<addaction name="actionVFO"/>
|
1519
1520
|
</widget>
|
1520
1521
|
<widget class="QMenu" name="menuOther">
|
@@ -1780,7 +1781,7 @@
|
|
1780
1781
|
<property name="shortcutVisibleInContextMenu">
|
1781
1782
|
<bool>false</bool>
|
1782
1783
|
</property>
|
1783
|
-
</action>
|
1784
|
+
</action>
|
1784
1785
|
<action name="actionGenerate_EDI">
|
1785
1786
|
<property name="text">
|
1786
1787
|
<string>Generate EDI</string>
|
@@ -2057,6 +2058,22 @@
|
|
2057
2058
|
<string>Command Buttons</string>
|
2058
2059
|
</property>
|
2059
2060
|
</action>
|
2061
|
+
<action name="actionStatistics">
|
2062
|
+
<property name="checkable">
|
2063
|
+
<bool>true</bool>
|
2064
|
+
</property>
|
2065
|
+
<property name="text">
|
2066
|
+
<string>Statistics</string>
|
2067
|
+
</property>
|
2068
|
+
<property name="font">
|
2069
|
+
<font>
|
2070
|
+
<family>JetBrains Mono ExtraLight</family>
|
2071
|
+
</font>
|
2072
|
+
</property>
|
2073
|
+
<property name="shortcut">
|
2074
|
+
<string>Alt+S</string>
|
2075
|
+
</property>
|
2076
|
+
</action>
|
2060
2077
|
</widget>
|
2061
2078
|
<resources/>
|
2062
2079
|
<connections/>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ui version="4.0">
|
3
|
+
<class>DockWidget</class>
|
4
|
+
<widget class="QDockWidget" name="DockWidget">
|
5
|
+
<property name="geometry">
|
6
|
+
<rect>
|
7
|
+
<x>0</x>
|
8
|
+
<y>0</y>
|
9
|
+
<width>294</width>
|
10
|
+
<height>192</height>
|
11
|
+
</rect>
|
12
|
+
</property>
|
13
|
+
<property name="windowTitle">
|
14
|
+
<string>Stats</string>
|
15
|
+
</property>
|
16
|
+
<widget class="QWidget" name="dockWidgetContents">
|
17
|
+
<layout class="QGridLayout" name="gridLayout">
|
18
|
+
<item row="1" column="2">
|
19
|
+
<widget class="QTableWidget" name="tableWidget">
|
20
|
+
<column>
|
21
|
+
<property name="text">
|
22
|
+
<string>Band</string>
|
23
|
+
</property>
|
24
|
+
</column>
|
25
|
+
<column>
|
26
|
+
<property name="text">
|
27
|
+
<string>QSO's</string>
|
28
|
+
</property>
|
29
|
+
</column>
|
30
|
+
<column>
|
31
|
+
<property name="text">
|
32
|
+
<string>Calls</string>
|
33
|
+
</property>
|
34
|
+
</column>
|
35
|
+
<column>
|
36
|
+
<property name="text">
|
37
|
+
<string>Points</string>
|
38
|
+
</property>
|
39
|
+
</column>
|
40
|
+
</widget>
|
41
|
+
</item>
|
42
|
+
</layout>
|
43
|
+
</widget>
|
44
|
+
</widget>
|
45
|
+
<resources/>
|
46
|
+
<connections/>
|
47
|
+
</ui>
|
not1mm/lib/version.py
CHANGED
not1mm/statistics.py
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
import datetime
|
2
|
+
import logging
|
3
|
+
import os
|
4
|
+
|
5
|
+
# import sys
|
6
|
+
|
7
|
+
from PyQt6 import uic, QtWidgets
|
8
|
+
from PyQt6.QtWidgets import QDockWidget
|
9
|
+
from PyQt6.QtCore import pyqtSignal, QTimer
|
10
|
+
|
11
|
+
# from PyQt6.QtGui import QColorConstants, QPalette, QColor
|
12
|
+
|
13
|
+
import not1mm.fsutils as fsutils
|
14
|
+
from not1mm.lib.database import DataBase
|
15
|
+
|
16
|
+
from json import loads
|
17
|
+
from json.decoder import JSONDecodeError
|
18
|
+
|
19
|
+
logger = logging.getLogger(__name__)
|
20
|
+
|
21
|
+
|
22
|
+
class StatsWindow(QDockWidget):
|
23
|
+
"""The stats window. Shows something important."""
|
24
|
+
|
25
|
+
message = pyqtSignal(dict)
|
26
|
+
dbname = None
|
27
|
+
pref = {}
|
28
|
+
poll_time = datetime.datetime.now() + datetime.timedelta(milliseconds=1000)
|
29
|
+
|
30
|
+
def __init__(self):
|
31
|
+
super().__init__()
|
32
|
+
self.active = False
|
33
|
+
self.load_pref()
|
34
|
+
self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
|
35
|
+
"current_database", "ham.db"
|
36
|
+
)
|
37
|
+
self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
|
38
|
+
self.database.current_contest = self.pref.get("contest", 0)
|
39
|
+
self.load_pref()
|
40
|
+
self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
|
41
|
+
"current_database", "ham.db"
|
42
|
+
)
|
43
|
+
self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
|
44
|
+
self.database.current_contest = self.pref.get("contest", 0)
|
45
|
+
uic.loadUi(fsutils.APP_DATA_PATH / "statistics.ui", self)
|
46
|
+
self.timer = QTimer()
|
47
|
+
self.timer.timeout.connect(self.get_run_and_total_qs)
|
48
|
+
self.timer.start(5000)
|
49
|
+
|
50
|
+
def msg_from_main(self, packet):
|
51
|
+
""""""
|
52
|
+
if packet.get("cmd", "") == "DARKMODE":
|
53
|
+
self.setDarkMode(packet.get("state", False))
|
54
|
+
return
|
55
|
+
|
56
|
+
if self.active is False:
|
57
|
+
return
|
58
|
+
|
59
|
+
if packet.get("cmd", "") == "UPDATELOG":
|
60
|
+
logger.debug("External refresh command.")
|
61
|
+
self.get_run_and_total_qs()
|
62
|
+
return
|
63
|
+
|
64
|
+
if packet.get("cmd", "") == "NEWDB":
|
65
|
+
self.load_pref()
|
66
|
+
self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
|
67
|
+
"current_database", "ham.db"
|
68
|
+
)
|
69
|
+
self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
|
70
|
+
self.database.current_contest = self.pref.get("contest", 0)
|
71
|
+
|
72
|
+
def setActive(self, mode: bool) -> None:
|
73
|
+
self.active = bool(mode)
|
74
|
+
|
75
|
+
def setDarkMode(self, dark: bool) -> None:
|
76
|
+
"""Forces a darkmode palette."""
|
77
|
+
|
78
|
+
def load_pref(self) -> None:
|
79
|
+
"""
|
80
|
+
Load preference file to get current db filename and sets the initial darkmode state.
|
81
|
+
|
82
|
+
Parameters
|
83
|
+
----------
|
84
|
+
None
|
85
|
+
|
86
|
+
Returns
|
87
|
+
-------
|
88
|
+
None
|
89
|
+
"""
|
90
|
+
try:
|
91
|
+
if os.path.exists(fsutils.CONFIG_FILE):
|
92
|
+
with open(
|
93
|
+
fsutils.CONFIG_FILE, "rt", encoding="utf-8"
|
94
|
+
) as file_descriptor:
|
95
|
+
self.pref = loads(file_descriptor.read())
|
96
|
+
logger.info(f"loaded config file from {fsutils.CONFIG_FILE}")
|
97
|
+
else:
|
98
|
+
self.pref["current_database"] = "ham.db"
|
99
|
+
|
100
|
+
except (IOError, JSONDecodeError) as exception:
|
101
|
+
logger.critical("Error: %s", exception)
|
102
|
+
self.setDarkMode(self.pref.get("darkmode", False))
|
103
|
+
|
104
|
+
def get_run_and_total_qs(self):
|
105
|
+
"""get numbers"""
|
106
|
+
if self.active is False:
|
107
|
+
return
|
108
|
+
self.tableWidget.clear()
|
109
|
+
self.tableWidget.setColumnCount(7)
|
110
|
+
self.tableWidget.setHorizontalHeaderLabels(
|
111
|
+
["BAND", "QSO", "CALLS", "CW", "PH", "DI", "PTS"]
|
112
|
+
)
|
113
|
+
self.tableWidget.verticalHeader().setVisible(False)
|
114
|
+
self.tableWidget.setEditTriggers(
|
115
|
+
QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers
|
116
|
+
)
|
117
|
+
self.tableWidget.setSelectionMode(
|
118
|
+
QtWidgets.QAbstractItemView.SelectionMode.NoSelection
|
119
|
+
)
|
120
|
+
query = f"select DISTINCT(Band) as band from DXLOG where ContestNR = {self.database.current_contest};"
|
121
|
+
result = self.database.exec_sql_mult(query)
|
122
|
+
self.tableWidget.setRowCount(len(result) + 1)
|
123
|
+
row = 0
|
124
|
+
for band in result:
|
125
|
+
query = f"select count(*) as qs, count(DISTINCT(Call)) as calls, sum(Points) as points from DXLOG where ContestNR = {self.database.current_contest} and Band = '{band['band']}';"
|
126
|
+
result = self.database.exec_sql(query)
|
127
|
+
item = QtWidgets.QTableWidgetItem(str(band["band"]))
|
128
|
+
item.setTextAlignment(0x0002)
|
129
|
+
self.tableWidget.setItem(row, 0, item)
|
130
|
+
item = QtWidgets.QTableWidgetItem(str(result["qs"]))
|
131
|
+
item.setTextAlignment(0x0002)
|
132
|
+
self.tableWidget.setItem(row, 1, item)
|
133
|
+
item = QtWidgets.QTableWidgetItem(str(result["calls"]))
|
134
|
+
item.setTextAlignment(0x0002)
|
135
|
+
self.tableWidget.setItem(row, 2, item)
|
136
|
+
item = QtWidgets.QTableWidgetItem(str(result["points"]))
|
137
|
+
item.setTextAlignment(0x0002)
|
138
|
+
self.tableWidget.setItem(row, 6, item)
|
139
|
+
query = f"select sum(sortedmode.mode == 'CW') as CW, sum(sortedmode.mode == 'PH') as PH, sum(sortedmode.mode == 'DI') as DI from (select CASE Mode WHEN 'LSB' THEN 'PH' WHEN 'USB' THEN 'PH' WHEN 'CW' THEN 'CW' WHEN 'RTTY' THEN 'DI' ELSE 'OTHER' END mode from DXLOG where ContestNR = {self.database.current_contest} and Band = '{band['band']}') as sortedmode;"
|
140
|
+
result = self.database.exec_sql(query)
|
141
|
+
item = QtWidgets.QTableWidgetItem(str(result["CW"]))
|
142
|
+
item.setTextAlignment(0x0002)
|
143
|
+
self.tableWidget.setItem(row, 3, item)
|
144
|
+
item = QtWidgets.QTableWidgetItem(str(result["PH"]))
|
145
|
+
item.setTextAlignment(0x0002)
|
146
|
+
self.tableWidget.setItem(row, 4, item)
|
147
|
+
item = QtWidgets.QTableWidgetItem(str(result["DI"]))
|
148
|
+
item.setTextAlignment(0x0002)
|
149
|
+
self.tableWidget.setItem(row, 5, item)
|
150
|
+
|
151
|
+
row += 1
|
152
|
+
query = f"select count(*) as qs, count(DISTINCT(Call)) as calls, sum(Points) as points from DXLOG where ContestNR = {self.database.current_contest};"
|
153
|
+
result = self.database.exec_sql(query)
|
154
|
+
item = QtWidgets.QTableWidgetItem("TOTAL")
|
155
|
+
item.setTextAlignment(0x0002)
|
156
|
+
self.tableWidget.setItem(row, 0, item)
|
157
|
+
item = QtWidgets.QTableWidgetItem(str(result["qs"]))
|
158
|
+
item.setTextAlignment(0x0002)
|
159
|
+
self.tableWidget.setItem(row, 1, item)
|
160
|
+
item = QtWidgets.QTableWidgetItem(str(result["calls"]))
|
161
|
+
item.setTextAlignment(0x0002)
|
162
|
+
self.tableWidget.setItem(row, 2, item)
|
163
|
+
item = QtWidgets.QTableWidgetItem(str(result["points"]))
|
164
|
+
item.setTextAlignment(0x0002)
|
165
|
+
self.tableWidget.setItem(row, 6, item)
|
166
|
+
|
167
|
+
query = f"select sum(sortedmode.mode == 'CW') as CW, sum(sortedmode.mode == 'PH') as PH, sum(sortedmode.mode == 'DI') as DI from (select CASE Mode WHEN 'LSB' THEN 'PH' WHEN 'USB' THEN 'PH' WHEN 'CW' THEN 'CW' WHEN 'RTTY' THEN 'DI' ELSE 'OTHER' END mode from DXLOG where ContestNR = {self.database.current_contest}) as sortedmode;"
|
168
|
+
result = self.database.exec_sql(query)
|
169
|
+
item = QtWidgets.QTableWidgetItem(str(result["CW"]))
|
170
|
+
item.setTextAlignment(0x0002)
|
171
|
+
self.tableWidget.setItem(row, 3, item)
|
172
|
+
item = QtWidgets.QTableWidgetItem(str(result["PH"]))
|
173
|
+
item.setTextAlignment(0x0002)
|
174
|
+
self.tableWidget.setItem(row, 4, item)
|
175
|
+
item = QtWidgets.QTableWidgetItem(str(result["DI"]))
|
176
|
+
item.setTextAlignment(0x0002)
|
177
|
+
self.tableWidget.setItem(row, 5, item)
|
178
|
+
self.tableWidget.resizeColumnsToContents()
|
179
|
+
self.tableWidget.resizeRowsToContents()
|
180
|
+
|
181
|
+
|
182
|
+
if __name__ == "__main__":
|
183
|
+
print("This is not a program.\nTry Again.")
|
@@ -1,13 +1,13 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: not1mm
|
3
|
-
Version: 25.3.
|
3
|
+
Version: 25.3.24
|
4
4
|
Summary: NOT1MM Logger
|
5
5
|
Author-email: Michael Bridak <michael.bridak@gmail.com>
|
6
|
+
License-Expression: GPL-3.0-or-later
|
6
7
|
Project-URL: Homepage, https://github.com/mbridak/not1mm
|
7
8
|
Project-URL: Bug Tracker, https://github.com/mbridak/not1mm/issues
|
8
9
|
Classifier: Programming Language :: Python :: 3
|
9
10
|
Classifier: Development Status :: 5 - Production/Stable
|
10
|
-
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
11
11
|
Classifier: Environment :: X11 Applications :: Qt
|
12
12
|
Classifier: Operating System :: POSIX :: Linux
|
13
13
|
Classifier: Intended Audience :: End Users/Desktop
|
@@ -28,6 +28,7 @@ Requires-Dist: notctyparser>=23.6.21
|
|
28
28
|
Requires-Dist: rapidfuzz
|
29
29
|
Requires-Dist: appdata
|
30
30
|
Requires-Dist: Levenshtein
|
31
|
+
Dynamic: license-file
|
31
32
|
|
32
33
|
# Not1MM
|
33
34
|
<!-- markdownlint-disable MD001 MD033 -->
|
@@ -246,6 +247,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
246
247
|
|
247
248
|
## Recent Changes
|
248
249
|
|
250
|
+
- [25-3-24] Add CW, PH, DI counts to the statistics window.
|
251
|
+
- [25-3-23] Add a statistics window.
|
249
252
|
- [25-3-19-1] Add EA His Maj King of Spain SSB.
|
250
253
|
- [25-3-19] Merged PR from @DD5ML Adding DARC VHF.
|
251
254
|
- [25-3-18] Add His Maj King of Spain CW
|
@@ -1,5 +1,5 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
2
|
+
not1mm/__main__.py,sha256=TKA6hSE2A2SZpXvMySGXNVgfE3UKhvzSC8tSzzVZTBs,151537
|
3
3
|
not1mm/bandmap.py,sha256=mdSK6oj8plEmr6WVYkzPTCfsHWKl9lea3R14cmRsAI4,31531
|
4
4
|
not1mm/checkwindow.py,sha256=VFAcKYTcoWhmIf91chwY6tyao9FQMWPiUkgDDkkWaog,9670
|
5
5
|
not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
|
@@ -8,6 +8,7 @@ not1mm/lookupservice.py,sha256=GkY_qHZfrW6XHf8upIoaG4hCFqm0fg6Ganu9ConGrIc,2628
|
|
8
8
|
not1mm/radio.py,sha256=_b-tSFuDLoBKnABxrsafGQu2p33U-KOubY7-qgLV2yg,5408
|
9
9
|
not1mm/ratewindow.py,sha256=UVkQt0nSB2COQlJQV6tFtsz4mP7d-Wj9jcjqvZw934Q,9891
|
10
10
|
not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
|
11
|
+
not1mm/statistics.py,sha256=tQFg30ACVvr70d86-iESoogzrQ_oigPbqT-IZm1srpo,7659
|
11
12
|
not1mm/test.py,sha256=RN71m2S9MPIOJMaoCi0wZhwEhpEZunvtosZxaKahRB4,101
|
12
13
|
not1mm/vfo.py,sha256=ggPyWtxMbdSE5RwdK0nDRwDNqOxdpb_pvnzZdbzZVQE,11136
|
13
14
|
not1mm/voice_keying.py,sha256=HZImqC5NgnyW2nknNYQ3b7I8-6S_hxpq5G4RcIRXn_k,3005
|
@@ -32,7 +33,7 @@ not1mm/data/k6gte.not1mm-32.png,sha256=XdTsCa3xqwTfn26Ga7RwO_Vlbg_77RKkSc8bMxVcC
|
|
32
33
|
not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N90,2925
|
33
34
|
not1mm/data/logwindow.ui,sha256=f7vULj96tHIQuR1nJMyvPHHcmVgzkhv9D1isyojsnFU,1458
|
34
35
|
not1mm/data/logwindowx.ui,sha256=CwpI-h7cI1yqyldH9quKftsdHL5lTyL9ABOcf80nfqc,1632
|
35
|
-
not1mm/data/main.ui,sha256
|
36
|
+
not1mm/data/main.ui,sha256=-yhNNnaqYiAXueK4wKg3qn4tqo4EUlcSm88qQfXUVOM,63800
|
36
37
|
not1mm/data/new_contest.ui,sha256=m41EGeg1yPSUZAkF8jA2z1EKytZD9hZYiQDh1sjE2ac,24602
|
37
38
|
not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
|
38
39
|
not1mm/data/opon.ui,sha256=QDicqAk2lORG2UWsHa6jHlsGn6uzrrI2R4HSAocpPes,2258
|
@@ -46,6 +47,7 @@ not1mm/data/rttymacros.txt,sha256=FQ2BnAChXF5w-tzmMnBOE8IgvviAEsd3cmmz4b8GOPk,46
|
|
46
47
|
not1mm/data/settings.ui,sha256=rZmhUjFAyCA8B-cd4Ljrvz5qC3NKy6S3feYVh5WX-tw,40084
|
47
48
|
not1mm/data/splash.png,sha256=85_BQotR1q24uCthrKm4SB_6ZOMwRjR-Jdp1XBHSTyg,5368
|
48
49
|
not1mm/data/ssbmacros.txt,sha256=Q7MrkaBntbeg4yQSoMv3NLoM24V4y_RVati3_wmb0mY,464
|
50
|
+
not1mm/data/statistics.ui,sha256=8hW3SxJzB4nsxo1DcJTF9oH4dPjvxo27qutAQsgl0dY,1073
|
49
51
|
not1mm/data/vfo.ui,sha256=-fmFMJLPDz0jmsOdCljL7vfmlAQgwyHkGZjomlIN3gc,2076
|
50
52
|
not1mm/data/phonetics/0.wav,sha256=0OpYiR-3MK6fVHE6MB-HeOxSAPiDNMjqvx5JcIZtsQk,42590
|
51
53
|
not1mm/data/phonetics/1.wav,sha256=OEAavA8cfVxFZwaT0HY9Wg9NAGEPKBhwhEdzGXkQs_U,30248
|
@@ -116,7 +118,7 @@ not1mm/lib/plugin_common.py,sha256=D1OBjyLmX7zuSPqgTCmHwXzAKA12J_zTQItvyIem-4Y,1
|
|
116
118
|
not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
|
117
119
|
not1mm/lib/settings.py,sha256=mXffn8Xaj5KATPQinNBR0V5DbHWQPsRfh24_axWGYuk,15254
|
118
120
|
not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
|
119
|
-
not1mm/lib/version.py,sha256=
|
121
|
+
not1mm/lib/version.py,sha256=TwlZeMOON2yGjP4amQ9-MNVirRzyqwv4djYoZb27rkY,48
|
120
122
|
not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
|
121
123
|
not1mm/plugins/10_10_fall_cw.py,sha256=P63dEhRmvsEV7ixHYg-qhs5zzj0_DJXjjPHQBQr8Wwg,14731
|
122
124
|
not1mm/plugins/10_10_spring_cw.py,sha256=S_z-KbExH4_kfRbKo07zM-iVlJUKxFwzbm6LRnXYyNU,14734
|
@@ -171,9 +173,9 @@ not1mm/plugins/ref_ssb.py,sha256=tGK5XeFrc3z7l8OViG9DM3rc4HLUBF9S3SUkaAPrjQk,215
|
|
171
173
|
not1mm/plugins/stew_perry_topband.py,sha256=LHt0WnWMRS_m5nO9BOIQs0kO38M6x-k4eaA4nbEqDVA,15353
|
172
174
|
not1mm/plugins/weekly_rtty.py,sha256=4gfFg25KGkU9tKmwslHLc38qPAXuRGWNX48n582NC7w,20078
|
173
175
|
not1mm/plugins/winter_field_day.py,sha256=jLgEr95hJCZoc3Fi95PiNeB06thPQHFI3zOHmR6NprE,15234
|
174
|
-
not1mm-25.3.
|
175
|
-
not1mm-25.3.
|
176
|
-
not1mm-25.3.
|
177
|
-
not1mm-25.3.
|
178
|
-
not1mm-25.3.
|
179
|
-
not1mm-25.3.
|
176
|
+
not1mm-25.3.24.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
177
|
+
not1mm-25.3.24.dist-info/METADATA,sha256=4mn9fR27nhlDe5Od0K68ySALpGrIapLrzohw9Fmtr9w,37303
|
178
|
+
not1mm-25.3.24.dist-info/WHEEL,sha256=DK49LOLCYiurdXXOXwGJm6U4DkHkg4lcxjhqwRa0CP4,91
|
179
|
+
not1mm-25.3.24.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
180
|
+
not1mm-25.3.24.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
181
|
+
not1mm-25.3.24.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|