not1mm 24.3.27__py3-none-any.whl → 24.4.1.1__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 CHANGED
@@ -1366,9 +1366,7 @@ class MainWindow(QtWidgets.QMainWindow):
1366
1366
  def launch_log_window(self) -> None:
1367
1367
  """Launch the log window"""
1368
1368
  if not self.log_window:
1369
- log_widget = LogWindow()
1370
- self.log_window = QDockWidget(log_widget.property("windowTitle"), self)
1371
- self.log_window.setWidget(log_widget)
1369
+ self.log_window = LogWindow()
1372
1370
  self.addDockWidget(Qt.BottomDockWidgetArea, self.log_window)
1373
1371
  self.log_window.show()
1374
1372
 
@@ -1382,18 +1380,14 @@ class MainWindow(QtWidgets.QMainWindow):
1382
1380
  def launch_check_window(self) -> None:
1383
1381
  """Launch the check window"""
1384
1382
  if not self.check_window:
1385
- check_widget = CheckWindow()
1386
- self.check_window = QDockWidget(check_widget.property("windowTitle"), self)
1387
- self.check_window.setWidget(check_widget)
1383
+ self.check_window = CheckWindow()
1388
1384
  self.addDockWidget(Qt.RightDockWidgetArea, self.check_window)
1389
1385
  self.check_window.show()
1390
1386
 
1391
1387
  def launch_vfo(self) -> None:
1392
1388
  """Launch the VFO window"""
1393
1389
  if not self.vfo_window:
1394
- vfo_widget = VfoWindow()
1395
- self.vfo_window = QDockWidget(vfo_widget.property("windowTitle"), self)
1396
- self.vfo_window.setWidget(vfo_widget)
1390
+ self.vfo_window = VfoWindow()
1397
1391
  self.addDockWidget(Qt.RightDockWidgetArea, self.vfo_window)
1398
1392
  self.vfo_window.show()
1399
1393
 
not1mm/checkwindow.py CHANGED
@@ -10,11 +10,12 @@ import os
10
10
  import platform
11
11
  import queue
12
12
  from json import loads
13
+ import Levenshtein
13
14
 
14
15
  from PyQt5 import QtGui, uic
15
16
  from PyQt5.QtCore import Qt
16
- from PyQt5.QtWidgets import QListWidgetItem
17
- from PyQt5.QtWidgets import QWidget
17
+ from PyQt5.QtWidgets import QLabel, QVBoxLayout, QWidget, QDockWidget
18
+ from PyQt5.QtGui import QMouseEvent
18
19
 
19
20
  import not1mm.fsutils as fsutils
20
21
  from not1mm.lib.database import DataBase
@@ -24,12 +25,21 @@ from not1mm.lib.super_check_partial import SCP
24
25
  logger = logging.getLogger(__name__)
25
26
 
26
27
 
27
- class CheckWindow(QWidget):
28
+ class CheckWindow(QDockWidget):
28
29
  """The check window. Shows list or probable stations."""
29
30
 
30
31
  multicast_interface = None
31
32
  dbname = None
32
33
  pref = {}
34
+ call = None
35
+ masterLayout: QVBoxLayout = None
36
+ dxcLayout: QVBoxLayout = None
37
+ qsoLayout: QVBoxLayout = None
38
+
39
+ character_remove_color = "#cc3333"
40
+ character_add_color = "#3333cc"
41
+
42
+ masterScrollWidget: QWidget = None
33
43
 
34
44
  def __init__(self, *args, **kwargs):
35
45
  super().__init__(*args, **kwargs)
@@ -42,15 +52,6 @@ class CheckWindow(QWidget):
42
52
 
43
53
  uic.loadUi(fsutils.APP_DATA_PATH / "checkwindow.ui", self)
44
54
 
45
- self.logList.clear()
46
- self.logList.itemClicked.connect(self.item_clicked)
47
- self.masterList.clear()
48
- self.masterList.itemClicked.connect(self.item_clicked)
49
- self.telnetList.clear()
50
- self.telnetList.itemClicked.connect(self.item_clicked)
51
- self.callhistoryList.clear()
52
- self.callhistoryList.hide()
53
- self.callhistoryListLabel.hide()
54
55
  self.mscp = SCP(fsutils.APP_DATA_PATH)
55
56
  self._udpwatch = None
56
57
  self.udp_fifo = queue.Queue()
@@ -67,7 +68,7 @@ class CheckWindow(QWidget):
67
68
  cmd = {}
68
69
  cmd["cmd"] = "CHANGECALL"
69
70
  cmd["station"] = platform.node()
70
- cmd["call"] = item.text()
71
+ cmd["call"] = item
71
72
  self.multicast_interface.send_as_json(cmd)
72
73
 
73
74
  def setDarkMode(self, dark: bool):
@@ -99,6 +100,7 @@ class CheckWindow(QWidget):
99
100
  )
100
101
 
101
102
  self.setPalette(darkPalette)
103
+ # self.CheckPartialWindow.setPalette(darkPalette)
102
104
  else:
103
105
  palette = self.style().standardPalette()
104
106
  self.setPalette(palette)
@@ -151,11 +153,12 @@ class CheckWindow(QWidget):
151
153
  self.clear_lists()
152
154
  if json_data.get("cmd", "") == "CALLCHANGED":
153
155
  call = json_data.get("call", "")
156
+ self.call = call
154
157
  self.master_list(call)
155
158
  self.log_list(call)
156
159
  continue
157
160
  if json_data.get("cmd", "") == "CHECKSPOTS":
158
- self.telnetList.clear()
161
+ self.populate_layout(self.dxcLayout, [])
159
162
  spots = json_data.get("spots", [])
160
163
  self.telnet_list(spots)
161
164
  continue
@@ -178,10 +181,9 @@ class CheckWindow(QWidget):
178
181
  -------
179
182
  None
180
183
  """
181
- self.logList.clear()
182
- self.masterList.clear()
183
- self.telnetList.clear()
184
- self.callhistoryList.clear()
184
+ self.populate_layout(self.masterLayout, [])
185
+ self.populate_layout(self.qsoLayout, [])
186
+ self.populate_layout(self.dxcLayout, [])
185
187
 
186
188
  def master_list(self, call: str) -> None:
187
189
  """
@@ -196,14 +198,9 @@ class CheckWindow(QWidget):
196
198
  -------
197
199
  None
198
200
  """
201
+ self.populate_layout(self.masterLayout, [])
199
202
  results = self.mscp.super_check(call)
200
- self.masterList.clear()
201
- for item in results:
202
- if "#" in item:
203
- continue
204
- listItem = QListWidgetItem(item)
205
- self.masterList.addItem(listItem)
206
- self.masterList.show()
203
+ self.populate_layout(self.masterLayout, filter(lambda x: "#" not in x, results))
207
204
 
208
205
  def log_list(self, call: str) -> None:
209
206
  """
@@ -218,13 +215,10 @@ class CheckWindow(QWidget):
218
215
  -------
219
216
  None
220
217
  """
221
- self.logList.clear()
218
+ self.populate_layout(self.qsoLayout, [])
222
219
  if call:
223
220
  result = self.database.get_like_calls_and_bands(call)
224
- for calls in result:
225
- listItem = QListWidgetItem(calls)
226
- self.logList.addItem(listItem)
227
- self.logList.show()
221
+ self.populate_layout(self.qsoLayout, result)
228
222
 
229
223
  def telnet_list(self, spots: list) -> None:
230
224
  """
@@ -239,10 +233,62 @@ class CheckWindow(QWidget):
239
233
  -------
240
234
  None
241
235
  """
242
- self.telnetList.clear()
236
+ self.populate_layout(self.dxcLayout, [])
243
237
  if spots:
244
- for calls in spots:
245
- call = calls.get("callsign", "")
246
- listItem = QListWidgetItem(call)
247
- self.telnetList.addItem(listItem)
248
- self.telnetList.show()
238
+ self.populate_layout(
239
+ self.dxcLayout,
240
+ filter(lambda x: x, [x.get("callsign", None) for x in spots]),
241
+ )
242
+
243
+ def populate_layout(self, layout, call_list):
244
+ for i in reversed(range(layout.count())):
245
+ if layout.itemAt(i).widget():
246
+ layout.itemAt(i).widget().setParent(None)
247
+ else:
248
+ layout.removeItem(layout.itemAt(i))
249
+ labels = []
250
+ for call in call_list:
251
+ if call:
252
+ if self.call:
253
+ label_text = ""
254
+ for tag, i1, i2, j1, j2 in Levenshtein.opcodes(call, self.call):
255
+ # logger.debug('{:7} a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
256
+ # tag, i1, i2, j1, j2, call[i1:i2], self.call[j1:j2]))
257
+ if tag == "equal":
258
+ label_text += call[i1:i2]
259
+ continue
260
+ elif tag == "replace":
261
+ label_text += f"<span style='background-color: {self.character_remove_color};'>{call[i1:i2]}</span>"
262
+ elif tag == "insert" or tag == "delete":
263
+ label_text += f"<span style='background-color: {self.character_add_color};'>{call[i1:i2]}</span>"
264
+ labels.append(
265
+ (
266
+ Levenshtein.hamming(call, self.call),
267
+ CallLabel(
268
+ label_text, call=call, callback=self.item_clicked
269
+ ),
270
+ )
271
+ )
272
+
273
+ for _, label in sorted(labels, key=lambda x: x[0]):
274
+ layout.addWidget(label)
275
+ # top aligns
276
+ layout.addStretch(0)
277
+
278
+
279
+ class CallLabel(QLabel):
280
+ call: str = None
281
+
282
+ def __init__(
283
+ self,
284
+ *args,
285
+ call=None,
286
+ callback=None,
287
+ ):
288
+ super().__init__(*args)
289
+ self.call = call
290
+ self.callback = callback
291
+
292
+ def mouseDoubleClickEvent(self, e: QMouseEvent) -> None:
293
+ if self.call and self.callback:
294
+ self.callback(self.call)
@@ -1,119 +1,171 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <ui version="4.0">
3
- <class>CheckWindow</class>
4
- <widget class="QWidget" name="CheckWindow">
3
+ <class>CheckPartialWindow</class>
4
+ <widget class="QDockWidget" name="CheckPartialWindow">
5
5
  <property name="geometry">
6
6
  <rect>
7
7
  <x>0</x>
8
8
  <y>0</y>
9
- <width>310</width>
10
- <height>600</height>
9
+ <width>322</width>
10
+ <height>374</height>
11
11
  </rect>
12
12
  </property>
13
13
  <property name="font">
14
14
  <font>
15
15
  <family>JetBrains Mono</family>
16
- <pointsize>12</pointsize>
17
16
  </font>
18
17
  </property>
18
+ <property name="focusPolicy">
19
+ <enum>Qt::NoFocus</enum>
20
+ </property>
19
21
  <property name="windowTitle">
20
- <string>Check Partial</string>
22
+ <string>CheckPartial</string>
21
23
  </property>
22
- <layout class="QGridLayout" name="gridLayout">
23
- <property name="leftMargin">
24
- <number>2</number>
25
- </property>
26
- <property name="topMargin">
27
- <number>2</number>
28
- </property>
29
- <property name="rightMargin">
30
- <number>2</number>
31
- </property>
32
- <property name="bottomMargin">
33
- <number>2</number>
34
- </property>
35
- <item row="1" column="1">
36
- <widget class="QListWidget" name="masterList">
37
- <property name="focusPolicy">
38
- <enum>Qt::NoFocus</enum>
39
- </property>
40
- </widget>
41
- </item>
42
- <item row="1" column="3">
43
- <widget class="QListWidget" name="callhistoryList">
44
- <property name="focusPolicy">
45
- <enum>Qt::NoFocus</enum>
46
- </property>
47
- </widget>
48
- </item>
49
- <item row="1" column="2">
50
- <widget class="QListWidget" name="telnetList">
51
- <property name="focusPolicy">
52
- <enum>Qt::NoFocus</enum>
53
- </property>
54
- </widget>
55
- </item>
56
- <item row="1" column="0">
57
- <widget class="QListWidget" name="logList">
58
- <property name="focusPolicy">
59
- <enum>Qt::NoFocus</enum>
60
- </property>
61
- </widget>
62
- </item>
63
- <item row="0" column="0">
64
- <widget class="QLabel" name="logListLabel">
65
- <property name="font">
66
- <font>
67
- <family>JetBrains Mono</family>
68
- <pointsize>10</pointsize>
69
- </font>
70
- </property>
71
- <property name="text">
72
- <string>Log</string>
73
- </property>
74
- </widget>
75
- </item>
76
- <item row="0" column="1">
77
- <widget class="QLabel" name="masterListLabel">
78
- <property name="font">
79
- <font>
80
- <family>JetBrains Mono</family>
81
- <pointsize>10</pointsize>
82
- </font>
83
- </property>
84
- <property name="text">
85
- <string>Master</string>
86
- </property>
87
- </widget>
88
- </item>
89
- <item row="0" column="2">
90
- <widget class="QLabel" name="telnetListLabel">
91
- <property name="font">
92
- <font>
93
- <family>JetBrains Mono</family>
94
- <pointsize>10</pointsize>
95
- </font>
96
- </property>
97
- <property name="text">
98
- <string>Telnet</string>
99
- </property>
100
- </widget>
101
- </item>
102
- <item row="0" column="3">
103
- <widget class="QLabel" name="callhistoryListLabel">
104
- <property name="font">
105
- <font>
106
- <family>JetBrains Mono</family>
107
- <pointsize>10</pointsize>
108
- </font>
109
- </property>
110
- <property name="text">
111
- <string>Call</string>
112
- </property>
113
- </widget>
114
- </item>
115
- </layout>
24
+ <widget class="QWidget" name="widget">
25
+ <layout class="QGridLayout" name="checkpartialgridlayout">
26
+ <property name="margin" stdset="0">
27
+ <number>2</number>
28
+ </property>
29
+ <item row="1" column="1">
30
+ <widget class="QScrollArea" name="masterAreaScroll">
31
+ <property name="focusPolicy">
32
+ <enum>Qt::ClickFocus</enum>
33
+ </property>
34
+ <property name="sizeAdjustPolicy">
35
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
36
+ </property>
37
+ <property name="widgetResizable">
38
+ <bool>true</bool>
39
+ </property>
40
+ <widget class="QWidget" name="masterScrollWidget">
41
+ <property name="geometry">
42
+ <rect>
43
+ <x>0</x>
44
+ <y>0</y>
45
+ <width>96</width>
46
+ <height>308</height>
47
+ </rect>
48
+ </property>
49
+ <layout class="QVBoxLayout" name="masterLayout">
50
+ <property name="spacing">
51
+ <number>0</number>
52
+ </property>
53
+ <property name="margin" stdset="0">
54
+ <number>0</number>
55
+ </property>
56
+ </layout>
57
+ </widget>
58
+ </widget>
59
+ </item>
60
+ <item row="1" column="2">
61
+ <widget class="QScrollArea" name="dxcAreaScroll">
62
+ <property name="focusPolicy">
63
+ <enum>Qt::ClickFocus</enum>
64
+ </property>
65
+ <property name="sizeAdjustPolicy">
66
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
67
+ </property>
68
+ <property name="widgetResizable">
69
+ <bool>true</bool>
70
+ </property>
71
+ <widget class="QWidget" name="dxcScrollWidget">
72
+ <property name="geometry">
73
+ <rect>
74
+ <x>0</x>
75
+ <y>0</y>
76
+ <width>95</width>
77
+ <height>308</height>
78
+ </rect>
79
+ </property>
80
+ <layout class="QVBoxLayout" name="dxcLayout">
81
+ <property name="spacing">
82
+ <number>0</number>
83
+ </property>
84
+ <property name="margin" stdset="0">
85
+ <number>0</number>
86
+ </property>
87
+ </layout>
88
+ </widget>
89
+ </widget>
90
+ </item>
91
+ <item row="1" column="0">
92
+ <widget class="QScrollArea" name="qsoAreaScroll">
93
+ <property name="focusPolicy">
94
+ <enum>Qt::ClickFocus</enum>
95
+ </property>
96
+ <property name="sizeAdjustPolicy">
97
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
98
+ </property>
99
+ <property name="widgetResizable">
100
+ <bool>true</bool>
101
+ </property>
102
+ <widget class="QWidget" name="qsoScrollWidget">
103
+ <property name="geometry">
104
+ <rect>
105
+ <x>0</x>
106
+ <y>0</y>
107
+ <width>95</width>
108
+ <height>308</height>
109
+ </rect>
110
+ </property>
111
+ <layout class="QVBoxLayout" name="qsoLayout">
112
+ <property name="spacing">
113
+ <number>0</number>
114
+ </property>
115
+ <property name="margin" stdset="0">
116
+ <number>0</number>
117
+ </property>
118
+ </layout>
119
+ </widget>
120
+ </widget>
121
+ </item>
122
+ <item row="0" column="0">
123
+ <widget class="QLabel" name="logListLabel">
124
+ <property name="font">
125
+ <font>
126
+ <family>JetBrains Mono</family>
127
+ <pointsize>10</pointsize>
128
+ </font>
129
+ </property>
130
+ <property name="text">
131
+ <string>Log</string>
132
+ </property>
133
+ </widget>
134
+ </item>
135
+ <item row="0" column="1">
136
+ <widget class="QLabel" name="masterListLabel">
137
+ <property name="font">
138
+ <font>
139
+ <family>JetBrains Mono</family>
140
+ <pointsize>10</pointsize>
141
+ </font>
142
+ </property>
143
+ <property name="text">
144
+ <string>Master</string>
145
+ </property>
146
+ </widget>
147
+ </item>
148
+ <item row="0" column="2">
149
+ <widget class="QLabel" name="telnetListLabel">
150
+ <property name="font">
151
+ <font>
152
+ <family>JetBrains Mono</family>
153
+ <pointsize>10</pointsize>
154
+ </font>
155
+ </property>
156
+ <property name="text">
157
+ <string>DXC</string>
158
+ </property>
159
+ </widget>
160
+ </item>
161
+ </layout>
162
+ </widget>
116
163
  </widget>
164
+ <tabstops>
165
+ <tabstop>dxcAreaScroll</tabstop>
166
+ <tabstop>qsoAreaScroll</tabstop>
167
+ <tabstop>masterAreaScroll</tabstop>
168
+ </tabstops>
117
169
  <resources/>
118
170
  <connections/>
119
171
  </ui>
not1mm/data/logwindow.ui CHANGED
@@ -1,65 +1,55 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <ui version="4.0">
3
- <class>LogWindow</class>
4
- <widget class="QWidget" name="LogWindow">
3
+ <class>DockWidget</class>
4
+ <widget class="QDockWidget" name="DockWidget">
5
5
  <property name="geometry">
6
6
  <rect>
7
7
  <x>0</x>
8
8
  <y>0</y>
9
- <width>825</width>
10
- <height>392</height>
9
+ <width>818</width>
10
+ <height>374</height>
11
11
  </rect>
12
12
  </property>
13
13
  <property name="windowTitle">
14
- <string>QSO Logs</string>
14
+ <string>DockWidget</string>
15
15
  </property>
16
- <layout class="QVBoxLayout" name="verticalLayout">
17
- <property name="leftMargin">
18
- <number>2</number>
19
- </property>
20
- <property name="topMargin">
21
- <number>2</number>
22
- </property>
23
- <property name="rightMargin">
24
- <number>2</number>
25
- </property>
26
- <property name="bottomMargin">
27
- <number>2</number>
28
- </property>
29
- <item>
30
- <widget class="QSplitter" name="splitter">
31
- <property name="orientation">
32
- <enum>Qt::Vertical</enum>
33
- </property>
34
- <widget class="QTableWidget" name="generalLog">
35
- <property name="font">
36
- <font>
37
- <family>JetBrains Mono</family>
38
- </font>
39
- </property>
40
- <property name="focusPolicy">
41
- <enum>Qt::NoFocus</enum>
42
- </property>
43
- <property name="tabKeyNavigation">
44
- <bool>false</bool>
45
- </property>
46
- </widget>
47
- <widget class="QTableWidget" name="focusedLog">
48
- <property name="font">
49
- <font>
50
- <family>JetBrains Mono</family>
51
- </font>
52
- </property>
53
- <property name="focusPolicy">
54
- <enum>Qt::NoFocus</enum>
55
- </property>
56
- <property name="tabKeyNavigation">
57
- <bool>false</bool>
16
+ <widget class="QWidget" name="dockWidgetContents">
17
+ <layout class="QVBoxLayout" name="verticalLayout">
18
+ <item>
19
+ <widget class="QSplitter" name="splitter">
20
+ <property name="orientation">
21
+ <enum>Qt::Vertical</enum>
58
22
  </property>
23
+ <widget class="QTableWidget" name="generalLog">
24
+ <property name="font">
25
+ <font>
26
+ <family>JetBrains Mono</family>
27
+ </font>
28
+ </property>
29
+ <property name="focusPolicy">
30
+ <enum>Qt::NoFocus</enum>
31
+ </property>
32
+ <property name="tabKeyNavigation">
33
+ <bool>false</bool>
34
+ </property>
35
+ </widget>
36
+ <widget class="QTableWidget" name="focusedLog">
37
+ <property name="font">
38
+ <font>
39
+ <family>JetBrains Mono</family>
40
+ </font>
41
+ </property>
42
+ <property name="focusPolicy">
43
+ <enum>Qt::NoFocus</enum>
44
+ </property>
45
+ <property name="tabKeyNavigation">
46
+ <bool>false</bool>
47
+ </property>
48
+ </widget>
59
49
  </widget>
60
- </widget>
61
- </item>
62
- </layout>
50
+ </item>
51
+ </layout>
52
+ </widget>
63
53
  </widget>
64
54
  <resources/>
65
55
  <connections/>
@@ -0,0 +1,66 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
3
+ <class>LogWindow</class>
4
+ <widget class="QWidget" name="LogWindow">
5
+ <property name="geometry">
6
+ <rect>
7
+ <x>0</x>
8
+ <y>0</y>
9
+ <width>825</width>
10
+ <height>392</height>
11
+ </rect>
12
+ </property>
13
+ <property name="windowTitle">
14
+ <string>QSO Logs</string>
15
+ </property>
16
+ <layout class="QVBoxLayout" name="verticalLayout">
17
+ <property name="leftMargin">
18
+ <number>2</number>
19
+ </property>
20
+ <property name="topMargin">
21
+ <number>2</number>
22
+ </property>
23
+ <property name="rightMargin">
24
+ <number>2</number>
25
+ </property>
26
+ <property name="bottomMargin">
27
+ <number>2</number>
28
+ </property>
29
+ <item>
30
+ <widget class="QSplitter" name="splitter">
31
+ <property name="orientation">
32
+ <enum>Qt::Vertical</enum>
33
+ </property>
34
+ <widget class="QTableWidget" name="generalLog">
35
+ <property name="font">
36
+ <font>
37
+ <family>JetBrains Mono</family>
38
+ </font>
39
+ </property>
40
+ <property name="focusPolicy">
41
+ <enum>Qt::NoFocus</enum>
42
+ </property>
43
+ <property name="tabKeyNavigation">
44
+ <bool>false</bool>
45
+ </property>
46
+ </widget>
47
+ <widget class="QTableWidget" name="focusedLog">
48
+ <property name="font">
49
+ <font>
50
+ <family>JetBrains Mono</family>
51
+ </font>
52
+ </property>
53
+ <property name="focusPolicy">
54
+ <enum>Qt::NoFocus</enum>
55
+ </property>
56
+ <property name="tabKeyNavigation">
57
+ <bool>false</bool>
58
+ </property>
59
+ </widget>
60
+ </widget>
61
+ </item>
62
+ </layout>
63
+ </widget>
64
+ <resources/>
65
+ <connections/>
66
+ </ui>
not1mm/data/vfo.ui CHANGED
@@ -1,83 +1,52 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <ui version="4.0">
3
- <class>VfoWindow</class>
4
- <widget class="QWidget" name="VfoWindow">
3
+ <class>DockWidget</class>
4
+ <widget class="QDockWidget" name="DockWidget">
5
5
  <property name="geometry">
6
6
  <rect>
7
7
  <x>0</x>
8
8
  <y>0</y>
9
- <width>570</width>
10
- <height>130</height>
9
+ <width>304</width>
10
+ <height>132</height>
11
11
  </rect>
12
12
  </property>
13
13
  <property name="windowTitle">
14
- <string>MainWindow</string>
14
+ <string>DockWidget</string>
15
15
  </property>
16
- <layout class="QGridLayout" name="gridLayout_3">
17
- <item row="0" column="0">
18
- <widget class="QMenuBar" name="menubar"/>
19
- </item>
20
- <item row="1" column="0">
21
- <layout class="QGridLayout" name="gridLayout">
22
- <item row="0" column="0">
23
- <widget class="QFrame" name="frame">
24
- <property name="sizePolicy">
25
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
26
- <horstretch>0</horstretch>
27
- <verstretch>0</verstretch>
28
- </sizepolicy>
29
- </property>
30
- <property name="frameShape">
31
- <enum>QFrame::StyledPanel</enum>
32
- </property>
33
- <property name="frameShadow">
34
- <enum>QFrame::Raised</enum>
35
- </property>
36
- <layout class="QGridLayout" name="gridLayout_2">
37
- <item row="0" column="0">
38
- <widget class="QLCDNumber" name="lcdNumber">
39
- <property name="sizePolicy">
40
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
41
- <horstretch>0</horstretch>
42
- <verstretch>0</verstretch>
43
- </sizepolicy>
44
- </property>
45
- <property name="font">
46
- <font>
47
- <pointsize>25</pointsize>
48
- </font>
49
- </property>
50
- <property name="autoFillBackground">
51
- <bool>false</bool>
52
- </property>
53
- <property name="smallDecimalPoint">
54
- <bool>false</bool>
55
- </property>
56
- <property name="digitCount">
57
- <number>11</number>
58
- </property>
59
- <property name="mode">
60
- <enum>QLCDNumber::Dec</enum>
61
- </property>
62
- <property name="segmentStyle">
63
- <enum>QLCDNumber::Flat</enum>
64
- </property>
65
- <property name="intValue" stdset="0">
66
- <number>14032000</number>
67
- </property>
68
- </widget>
69
- </item>
70
- </layout>
71
- </widget>
72
- </item>
73
- </layout>
74
- </item>
75
- </layout>
76
- <action name="actionQuit">
77
- <property name="text">
78
- <string>Quit</string>
79
- </property>
80
- </action>
16
+ <widget class="QWidget" name="dockWidgetContents">
17
+ <layout class="QGridLayout" name="gridLayout_2">
18
+ <item row="0" column="0">
19
+ <widget class="QFrame" name="frame">
20
+ <property name="frameShape">
21
+ <enum>QFrame::StyledPanel</enum>
22
+ </property>
23
+ <property name="frameShadow">
24
+ <enum>QFrame::Raised</enum>
25
+ </property>
26
+ <layout class="QGridLayout" name="gridLayout">
27
+ <item row="0" column="0">
28
+ <widget class="QLCDNumber" name="lcdNumber">
29
+ <property name="font">
30
+ <font>
31
+ <pointsize>25</pointsize>
32
+ </font>
33
+ </property>
34
+ <property name="digitCount">
35
+ <number>11</number>
36
+ </property>
37
+ <property name="segmentStyle">
38
+ <enum>QLCDNumber::Flat</enum>
39
+ </property>
40
+ <property name="intValue" stdset="0">
41
+ <number>14032000</number>
42
+ </property>
43
+ </widget>
44
+ </item>
45
+ </layout>
46
+ </widget>
47
+ </item>
48
+ </layout>
49
+ </widget>
81
50
  </widget>
82
51
  <resources/>
83
52
  <connections/>
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.3.27"
3
+ __version__ = "24.4.1.1"
not1mm/logwindow.py CHANGED
@@ -16,6 +16,7 @@ from json import loads
16
16
  import math
17
17
  from PyQt5 import QtCore, QtGui, QtWidgets, uic
18
18
  from PyQt5.QtCore import Qt, QItemSelectionModel
19
+ from PyQt5.QtWidgets import QDockWidget
19
20
 
20
21
  import not1mm.fsutils as fsutils
21
22
  from not1mm.lib.database import DataBase
@@ -51,7 +52,7 @@ def safe_float(the_input: any, default=0.0) -> float:
51
52
  return default
52
53
 
53
54
 
54
- class LogWindow(QtWidgets.QWidget):
55
+ class LogWindow(QDockWidget):
55
56
  """
56
57
  The main window
57
58
  """
not1mm/vfo.py CHANGED
@@ -16,7 +16,7 @@ from json import loads, JSONDecodeError
16
16
  import serial
17
17
  from PyQt5 import QtCore, QtGui, QtWidgets, uic
18
18
  from PyQt5.QtCore import Qt, QTimer
19
- from PyQt5.QtWidgets import QWidget
19
+ from PyQt5.QtWidgets import QWidget, QDockWidget
20
20
 
21
21
  import not1mm.fsutils as fsutils
22
22
  from not1mm.lib.cat_interface import CAT
@@ -25,7 +25,7 @@ from not1mm.lib.multicast import Multicast
25
25
  logger = logging.getLogger(__name__)
26
26
 
27
27
 
28
- class VfoWindow(QWidget):
28
+ class VfoWindow(QDockWidget):
29
29
  """The VFO window."""
30
30
 
31
31
  pref = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.3.27
3
+ Version: 24.4.1.1
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/mbridak/not1mm
@@ -28,6 +28,7 @@ Requires-Dist: numpy
28
28
  Requires-Dist: notctyparser >=23.6.21
29
29
  Requires-Dist: rapidfuzz
30
30
  Requires-Dist: appdata
31
+ Requires-Dist: Levenshtein
31
32
 
32
33
  # Not1MM
33
34
 
@@ -48,20 +49,20 @@ The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<
48
49
  - [Our Code Contributors ✨](#our-code-contributors-)
49
50
  - [List of should be working contests](#list-of-should-be-working-contests)
50
51
  - [Recent Changes](#recent-changes)
52
+ - [Flatpak](#flatpak)
51
53
  - [Installation](#installation)
52
54
  - [Prerequisites](#prerequisites)
53
- - [Common recipes for Ubuntu and Fedora](#common-recipes-for-ubuntu-and-fedora)
55
+ - [Common installation recipes for Ubuntu and Fedora](#common-installation-recipes-for-ubuntu-and-fedora)
54
56
  - [Ubuntu 22.04 LTS](#ubuntu-2204-lts)
55
57
  - [Ubuntu 23.04](#ubuntu-2304)
56
58
  - [Fedora 38 \& 39](#fedora-38--39)
57
59
  - [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
58
- - [Bootstrapping pipx](#bootstrapping-pipx)
59
- - [Installing with pipx](#installing-with-pipx)
60
+ - [Bootstrapping pipx](#bootstrapping-pipx)
61
+ - [Installing with pipx](#installing-with-pipx)
60
62
  - [After the install](#after-the-install)
61
63
  - [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
62
64
  - [Or this fan favorite](#or-this-fan-favorite)
63
- - [Running from source](#running-from-source)
64
- - [Wayland Compositor](#wayland-compositor)
65
+ - [Installing from GitHub source](#installing-from-github-source)
65
66
  - [Various data file locations](#various-data-file-locations)
66
67
  - [Data](#data)
67
68
  - [Config](#config)
@@ -90,25 +91,22 @@ The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<
90
91
  - [Macro use with voice](#macro-use-with-voice)
91
92
  - [cty.dat and QRZ lookups for distance and bearing](#ctydat-and-qrz-lookups-for-distance-and-bearing)
92
93
  - [Other uses for the call field](#other-uses-for-the-call-field)
93
- - [Windows](#windows)
94
+ - [The Windows](#the-windows)
94
95
  - [The Main Window](#the-main-window)
95
- - [Keyboard commands](#keyboard-commands)
96
- - [Log Display](#log-display)
96
+ - [Keyboard commands](#keyboard-commands)
97
+ - [The Log Window](#the-log-window)
97
98
  - [Editing a contact](#editing-a-contact)
98
- - [Recalulate Mults](#recalulate-mults)
99
- - [Bandmap](#bandmap)
100
- - [Check Window](#check-window)
101
- - [Remote VFO](#remote-vfo)
99
+ - [The Bandmap Window](#the-bandmap-window)
100
+ - [The Check Window](#the-check-window)
101
+ - [The Remote VFO Window](#the-remote-vfo-window)
102
102
  - [Cabrillo](#cabrillo)
103
103
  - [ADIF](#adif)
104
- - [Dupe checking](#dupe-checking)
104
+ - [Recalulate Mults](#recalulate-mults)
105
105
  - [Contest specific notes](#contest-specific-notes)
106
106
  - [ARRL Sweekstakes](#arrl-sweekstakes)
107
107
  - [The exchange parser](#the-exchange-parser)
108
108
  - [The exchange](#the-exchange)
109
109
 
110
- [Visit the Wiki](https://github.com/mbridak/not1mm/wiki/Not1MM)
111
-
112
110
  ## What and why is Not1MM
113
111
 
114
112
  Not1MM's interface is a blatant ripoff of N1MM. It is NOT N1MM and any problem
@@ -179,24 +177,18 @@ I wish to thank those who've contributed to the project.
179
177
 
180
178
  ## Recent Changes
181
179
 
182
- - [24-3-27] Made items in the checkwindow clickable. Removed connection check in bandmap preventing marked calls from appearing.
183
- - [24-3-25-1] Dark mode sorted out. Atleast for me...
184
- - [24-3-25] Yanked version 24-3-24-1. Fixed widget focus issues.
185
- - [24-3-24-1] Killed an SQL query bug causing crash when pressing arrow down.
186
- - [24-3-24] Reworked fsutil.py to correct directory paths for Linux.
187
- - [24-3-23] Yanked version 24-3-21, too many bugs for existing userbase.
188
- - [24-3-21] Merged PR from @kyleboyle for docking windows. MacOS and Windows support.
189
- - [24-3-19] Removed some useless bloat causing slow interface on FreeBSD 13/14 and maybe others.
190
- - [24-3-16] Add Save/Fail confirmation dialogs when saving ADIF of Cabrillo files.
191
- - [24-3-15] Change 'CWR' to 'CW' in the ADIF output.
192
- - [24-3-13] Added CQ 160 CW and SSB
193
- - [24-3-9] Marked calls in the bandmap window colored Blue, until worked.
194
- - [24-3-7] Merged PR from @arodland for faster fuzzy SCP lookups.
195
- - [24-3-2-1] Added marking stations on the bandmap to work later with CTRL-M.
196
- - [24-3-2] Merged PR from @arodland for fuzzy SCP lookup.
180
+ - [24-4-1-1] Added color text indicators to the Check Partial window. Poached the code from @kyleboyle. Thanks! Fixed the Log, VFO and Check Partial windows to be actual docking widgets.
181
+ - [24-4-1] Removed some un-needed loops and widgets from the check window.
197
182
 
198
183
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
199
184
 
185
+ ## Flatpak
186
+
187
+ I've tried for a couple days to get not1mm to build as a flatpak. I've failed.
188
+ It keeps failing at building numpy. If you happen to be a flatpak savant, please
189
+ feel free to look at com.github.mbridak.not1mm.yaml and python3-modules.yaml and
190
+ clue me into the black magic needed to get it to work.
191
+
200
192
  ## Installation
201
193
 
202
194
  ### Prerequisites
@@ -204,7 +196,10 @@ See [CHANGELOG.md](CHANGELOG.md) for prior changes.
204
196
  not1mm requires Python 3.9+, PyQt5 and libportaudio2. You should install these
205
197
  through your distribution's package manager before continuing.
206
198
 
207
- ### Common recipes for Ubuntu and Fedora
199
+ ### Common installation recipes for Ubuntu and Fedora
200
+
201
+ I've taken the time to install some common Linux distributions into a VM and
202
+ noted the minimum steps needed to install not1mm.
208
203
 
209
204
  #### Ubuntu 22.04 LTS
210
205
 
@@ -252,7 +247,7 @@ Linux distros will make you do this unless you include a command line argument
252
247
  akin to '--break-my-system' when using pip. I'm not telling you to use pipx.
253
248
  But... **Use pipx**.
254
249
 
255
- ### Bootstrapping pipx
250
+ #### Bootstrapping pipx
256
251
 
257
252
  Assuming you have only Python installed, your path to pipx is:
258
253
 
@@ -268,7 +263,7 @@ python3 -m pip install --user pipx
268
263
  python3 -m pipx ensurepath
269
264
  ```
270
265
 
271
- ### Installing with pipx
266
+ #### Installing with pipx
272
267
 
273
268
  Then installing not1mm is as simple as:
274
269
 
@@ -315,7 +310,7 @@ For a more permanent solution you can place the line
315
310
  `export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
316
311
  after logging out and back in you should be able to launch it normally.
317
312
 
318
- ### Running from source
313
+ ### Installing from GitHub source
319
314
 
320
315
  Since this is packaged for PyPI, if you want to work on your own source branch,
321
316
  after cloning from github you would:
@@ -344,13 +339,6 @@ or be in some other directory and just type:
344
339
  not1mm
345
340
  ```
346
341
 
347
- ## Wayland Compositor
348
-
349
- One side effect of Wayland is that we are not able to request for a window to
350
- regain or retain focus. So if you were to click on a spot in the bandmap window
351
- to tune to that spot, you would have to then click on the main window to
352
- continue entering contest data. I'm aware of this, but I can not change it.
353
-
354
342
  ## Various data file locations
355
343
 
356
344
  ### Data
@@ -562,13 +550,13 @@ is this has happened, since the gridsquare will replace the word "Regional".
562
550
 
563
551
  **You must press the SPACE bar after entering any of the above.**
564
552
 
565
- ## Windows
553
+ ## The Windows
566
554
 
567
555
  ### The Main Window
568
556
 
569
557
  ![Main screen with callouts](https://github.com/mbridak/not1mm/raw/master/pic/mainwithcallouts.png)
570
558
 
571
- ### Keyboard commands
559
+ #### Keyboard commands
572
560
 
573
561
  | Key | Result |
574
562
  | -------------- | --- |
@@ -588,7 +576,7 @@ is this has happened, since the gridsquare will replace the word "Regional".
588
576
  | [CTRL-G] | Tune to a spot matching partial text in the callsign entry field (CAT Required). |
589
577
  | [CTRL-SHIFT-K] | Open CW text input field. |
590
578
 
591
- ### Log Display
579
+ ### The Log Window
592
580
 
593
581
  `Window`>`Log Window`
594
582
 
@@ -615,13 +603,7 @@ You can not directly edit the multiplier status of a contact. Instead see the
615
603
  next section on recalculating mults. If you change the callsign make sure the
616
604
  `WPX` field is still valid.
617
605
 
618
- ## Recalulate Mults
619
-
620
- After editing a contact and before generating a Cabrillo file. There is a Misc
621
- menu option that will recalculate the multipliers incase an edit had caused a
622
- change.
623
-
624
- ## Bandmap
606
+ ### The Bandmap Window
625
607
 
626
608
  `Window`>`Bandmap`
627
609
 
@@ -640,7 +622,7 @@ blue rectangle shows the receivers bandwidth if one is reported.
640
622
  Clicked on spots now tune the radio and set the callsign field. Previously
641
623
  worked calls are displayed in red.
642
624
 
643
- ## Check Window
625
+ ### The Check Window
644
626
 
645
627
  `Window`>`Check Window`
646
628
 
@@ -654,7 +636,7 @@ Clicking on any of these items will change the callsign field.
654
636
 
655
637
  ![Check Window](https://github.com/mbridak/not1mm/raw/master/pic/checkwindow.png)
656
638
 
657
- ## Remote VFO
639
+ ### The Remote VFO Window
658
640
 
659
641
  You can control the VFO on a remote rig by following the directions listed in
660
642
  the link below. It's a small hardware project with a BOM of under $20, and
@@ -690,9 +672,11 @@ Boom... ADIF
690
672
 
691
673
  `StationCall`\_`ContestName`\_`Date`\_`Time`.adi
692
674
 
693
- ## Dupe checking
675
+ ## Recalulate Mults
694
676
 
695
- Added dupe checking. Big Red 'Dupe' will appear if it's a dupe...
677
+ After editing a contact and before generating a Cabrillo file. There is a Misc
678
+ menu option that will recalculate the multipliers incase an edit had caused a
679
+ change.
696
680
 
697
681
  ## Contest specific notes
698
682
 
@@ -1,17 +1,17 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=GhgvGedPUhRoahp924Qi6fAwbenCmuJXiE5F5pyuRHg,118379
2
+ not1mm/__main__.py,sha256=y7pJidcDn71lr-JLfZPQSqPDNgbrImeIgKgvJNhVrb8,117984
3
3
  not1mm/bandmap.py,sha256=a0QZj0HvPh8ixj207ANRHO29aKN3YMKolp_P47gSOtI,33404
4
- not1mm/checkwindow.py,sha256=TZbeX7IQCoKV8mKoB6HWUOZz6XxpDW7Vb3GvpDfehFs,7850
4
+ not1mm/checkwindow.py,sha256=3m3rYItlWtbnRWxI_k1ECmweuVJtf0W2tU1NjL6a8FU,9657
5
5
  not1mm/fsutils.py,sha256=Li8Tq9K7c_q7onOHOQ7u1dOOFfhIIz5Aj2LKuQtGOO4,1652
6
- not1mm/logwindow.py,sha256=2uy3oduImH1QNz5tBBrevsk7iMoYCUOTO7ttf92zN5w,43830
7
- not1mm/vfo.py,sha256=ghtTmkhrug8YxYXUlJZOk7wN8jR8XNZKYTrcs4-E4rw,11530
6
+ not1mm/logwindow.py,sha256=weejWrd-yo6SXX48sr2cjuIe_L-1hnba896A6hxv-EE,43864
7
+ not1mm/vfo.py,sha256=cEu8hjD3fZ6gfKOOFqoy9WVMFOOmOC9ab-x_6Wwzp4w,11547
8
8
  not1mm/data/JetBrainsMono-Regular.ttf,sha256=UOHctAKY_PzCGh7zy-6f6egnCcSK0wzmF0csBqO9lDY,203952
9
9
  not1mm/data/MASTER.SCP,sha256=1vQRvEZ865brfmmajp-Lj-hgWejVGI992q8o971bUV8,366478
10
10
  not1mm/data/about.ui,sha256=7TqvtXFFm0Rmcu0bmLupwpO1CsK8MekfZ09_xn6kZrQ,2067
11
11
  not1mm/data/alpha bravo charlie delta.txt,sha256=d5QMmSWEUAe4Rj1XbNjTPLa_5Be4Se6u5LUIqAYidOQ,224
12
12
  not1mm/data/bandmap.ui,sha256=NqVoAGyuf_Rsts_FnL0pYEtE08DJb6qm4KAQ_T01bM8,7125
13
13
  not1mm/data/check.png,sha256=UvFOLr8V-79qnjW8wUaGItXk_OSP8m8hqPevs8NDlFY,387
14
- not1mm/data/checkwindow.ui,sha256=UTyQ_aTh1Y8qR2XM2CC5xoKK9PkWfFxuEC55Msc_lhc,2912
14
+ not1mm/data/checkwindow.ui,sha256=0e8CqRy5yXLwAi_SRfYh4X1efz2IHzqLWUJPgNrjDDg,4611
15
15
  not1mm/data/configuration.ui,sha256=DJZxA4zZPb4sTdVn17j1fwaTw-5lJCNQ6PspQrsdMe4,51643
16
16
  not1mm/data/contests.sql,sha256=4hmJCDvrbxnA_Y5S4T5o52TZieeFk6QUwFerwlFePNA,89307
17
17
  not1mm/data/cty.json,sha256=CGf_bvqr_qfr0kXLQC0JGW1BWSX-1Ce8qZwDMMN7tuM,4783134
@@ -24,7 +24,8 @@ not1mm/data/k6gte-not1mm.desktop,sha256=bSiSG7PzGygv0bBaF7Nf48PApVyrobSBVNk7j7wR
24
24
  not1mm/data/k6gte.not1mm-128.png,sha256=ZP93MfRqr4WwsFCwg1m5MZjLs8bG895vDW9DDDn1B_Q,6076
25
25
  not1mm/data/k6gte.not1mm-32.png,sha256=XdTsCa3xqwTfn26Ga7RwO_Vlbg_77RKkSc8bMxVcCac,1526
26
26
  not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N90,2925
27
- not1mm/data/logwindow.ui,sha256=9FzDJtLRpagvAWcDjFdB9NnvNZ4bVxdTNHy1Jit2ido,1610
27
+ not1mm/data/logwindow.ui,sha256=vfkNdzJgFs3tTOBKLDavF2zVMvNHWOZ82fAErRi6pQY,1436
28
+ not1mm/data/logwindowx.ui,sha256=9FzDJtLRpagvAWcDjFdB9NnvNZ4bVxdTNHy1Jit2ido,1610
28
29
  not1mm/data/main.ui,sha256=X9sNqSZyKennX-7Ne4c8yLnkbN13T5YpDUeri-wPOn4,54070
29
30
  not1mm/data/new_contest.ui,sha256=Xubngdbs_V_-o8huXzKOOaQOfj1NSXu9giIcaL4d0qk,21823
30
31
  not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
@@ -36,7 +37,7 @@ not1mm/data/radio_red.png,sha256=QvkMk7thd_hCEIyK5xGAG4xVVXivl39nwOfD8USDI20,957
36
37
  not1mm/data/reddot.png,sha256=M33jEMoU8W4rQ4_MVyzzKxDPDte1ypKBch5VnUMNLKE,565
37
38
  not1mm/data/settings.ui,sha256=7r4aZwxKUHQGm8NLQGLINurGMvT_5VMU9p2dznW25bA,40028
38
39
  not1mm/data/ssbmacros.txt,sha256=0Qccj4y0nlK-w5da9a9ti-jILkURtwztoDuL_D0pEJM,470
39
- not1mm/data/vfo.ui,sha256=f18m5r3gMbm0xtPJAZH1qVvOggK24XKBL7OGmip_Ks8,2405
40
+ not1mm/data/vfo.ui,sha256=Fp_2lFrZgaLx0PZS8_JeoH4zKCCA4LUNtK3wmlyrztM,1413
40
41
  not1mm/data/phonetics/0.wav,sha256=0OpYiR-3MK6fVHE6MB-HeOxSAPiDNMjqvx5JcIZtsQk,42590
41
42
  not1mm/data/phonetics/1.wav,sha256=OEAavA8cfVxFZwaT0HY9Wg9NAGEPKBhwhEdzGXkQs_U,30248
42
43
  not1mm/data/phonetics/2.wav,sha256=AmCfvo8y8BT9OlHkCs_N4y_mUAjmyG_x9ahbgiwU2FE,29584
@@ -103,7 +104,7 @@ not1mm/lib/plugin_common.py,sha256=AAKBPCXzTWZJb-h08uPNnHVG7bSCg7kwukc211gFivY,8
103
104
  not1mm/lib/select_contest.py,sha256=Ezc7MTZXEbQ_nXK7gmghalqfbbDyxp0pAVt0-chBJOw,359
104
105
  not1mm/lib/settings.py,sha256=9dyXiUZcrR57EVemGDrO2ad3HSMQbe5ngl_bxtZtEic,8877
105
106
  not1mm/lib/super_check_partial.py,sha256=p5l3u2ZOCBtlWgbvskC50FpuoaIpR07tfC6zTdRWbh4,2334
106
- not1mm/lib/version.py,sha256=IpjqBMjJNDsk2O3WzC_DpJzHa21DCNn_zNQC9cgEwlg,48
107
+ not1mm/lib/version.py,sha256=gUR6aMT2qsB4VwR9eK35GmjHRw6xQLgG3L0-5h8FX3k,49
107
108
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
108
109
  not1mm/plugins/10_10_fall_cw.py,sha256=pG0cFmTNOFO03wXcI1a3EEaT1QK83yWIsrSdqCOU-gg,10834
109
110
  not1mm/plugins/10_10_spring_cw.py,sha256=aWTohVrnZpT0SlQuqq7zxQaYe4SExEkOl3NI8xYYJWI,10840
@@ -137,9 +138,9 @@ not1mm/plugins/naqp_ssb.py,sha256=pof1k6Eg_MDQXSaCOJLh1jfVyyIri0LdHYrZQu7P_gs,11
137
138
  not1mm/plugins/phone_weekly_test.py,sha256=EfLQzKREEXO_Ljg-q3VWg87JfbPVar9ydNhCdmHCrt8,12278
138
139
  not1mm/plugins/stew_perry_topband.py,sha256=bjcImkZhBXpw4XKogs85mpShz7QgYbVohvhFMQ050DI,10546
139
140
  not1mm/plugins/winter_field_day.py,sha256=7JK-RS1abcj1xQLnTF8rIPHRpDzmp4sAFBBML8b-Lwk,10212
140
- not1mm-24.3.27.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
141
- not1mm-24.3.27.dist-info/METADATA,sha256=9fH5dH0rYoyFXAwpZrm5xWOC9Y6HmprnJ5dAYBh4Z80,27117
142
- not1mm-24.3.27.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
143
- not1mm-24.3.27.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
144
- not1mm-24.3.27.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
145
- not1mm-24.3.27.dist-info/RECORD,,
141
+ not1mm-24.4.1.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
142
+ not1mm-24.4.1.1.dist-info/METADATA,sha256=9ECpINXJHA12eRbjp-kpDxqeabQm-k9Hh-j6sry8GbU,26391
143
+ not1mm-24.4.1.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
144
+ not1mm-24.4.1.1.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
145
+ not1mm-24.4.1.1.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
146
+ not1mm-24.4.1.1.dist-info/RECORD,,