not1mm 24.4.1__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 +3 -9
- not1mm/checkwindow.py +82 -31
- not1mm/data/checkwindow.ui +152 -100
- not1mm/data/logwindow.ui +40 -50
- not1mm/data/logwindowx.ui +66 -0
- not1mm/data/vfo.ui +39 -70
- not1mm/lib/version.py +1 -1
- not1mm/logwindow.py +2 -1
- not1mm/vfo.py +2 -2
- {not1mm-24.4.1.dist-info → not1mm-24.4.1.1.dist-info}/METADATA +3 -1
- {not1mm-24.4.1.dist-info → not1mm-24.4.1.1.dist-info}/RECORD +15 -14
- {not1mm-24.4.1.dist-info → not1mm-24.4.1.1.dist-info}/LICENSE +0 -0
- {not1mm-24.4.1.dist-info → not1mm-24.4.1.1.dist-info}/WHEEL +0 -0
- {not1mm-24.4.1.dist-info → not1mm-24.4.1.1.dist-info}/entry_points.txt +0 -0
- {not1mm-24.4.1.dist-info → not1mm-24.4.1.1.dist-info}/top_level.txt +0 -0
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
|
-
|
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
|
-
|
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
|
-
|
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,10 +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 QWidget
|
17
|
+
from PyQt5.QtWidgets import QLabel, QVBoxLayout, QWidget, QDockWidget
|
18
|
+
from PyQt5.QtGui import QMouseEvent
|
17
19
|
|
18
20
|
import not1mm.fsutils as fsutils
|
19
21
|
from not1mm.lib.database import DataBase
|
@@ -23,12 +25,21 @@ from not1mm.lib.super_check_partial import SCP
|
|
23
25
|
logger = logging.getLogger(__name__)
|
24
26
|
|
25
27
|
|
26
|
-
class CheckWindow(
|
28
|
+
class CheckWindow(QDockWidget):
|
27
29
|
"""The check window. Shows list or probable stations."""
|
28
30
|
|
29
31
|
multicast_interface = None
|
30
32
|
dbname = None
|
31
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
|
32
43
|
|
33
44
|
def __init__(self, *args, **kwargs):
|
34
45
|
super().__init__(*args, **kwargs)
|
@@ -41,15 +52,6 @@ class CheckWindow(QWidget):
|
|
41
52
|
|
42
53
|
uic.loadUi(fsutils.APP_DATA_PATH / "checkwindow.ui", self)
|
43
54
|
|
44
|
-
self.logList.clear()
|
45
|
-
self.logList.itemClicked.connect(self.item_clicked)
|
46
|
-
self.masterList.clear()
|
47
|
-
self.masterList.itemClicked.connect(self.item_clicked)
|
48
|
-
self.telnetList.clear()
|
49
|
-
self.telnetList.itemClicked.connect(self.item_clicked)
|
50
|
-
self.callhistoryList.clear()
|
51
|
-
self.callhistoryList.hide()
|
52
|
-
self.callhistoryListLabel.hide()
|
53
55
|
self.mscp = SCP(fsutils.APP_DATA_PATH)
|
54
56
|
self._udpwatch = None
|
55
57
|
self.udp_fifo = queue.Queue()
|
@@ -66,7 +68,7 @@ class CheckWindow(QWidget):
|
|
66
68
|
cmd = {}
|
67
69
|
cmd["cmd"] = "CHANGECALL"
|
68
70
|
cmd["station"] = platform.node()
|
69
|
-
cmd["call"] = item
|
71
|
+
cmd["call"] = item
|
70
72
|
self.multicast_interface.send_as_json(cmd)
|
71
73
|
|
72
74
|
def setDarkMode(self, dark: bool):
|
@@ -98,6 +100,7 @@ class CheckWindow(QWidget):
|
|
98
100
|
)
|
99
101
|
|
100
102
|
self.setPalette(darkPalette)
|
103
|
+
# self.CheckPartialWindow.setPalette(darkPalette)
|
101
104
|
else:
|
102
105
|
palette = self.style().standardPalette()
|
103
106
|
self.setPalette(palette)
|
@@ -150,11 +153,12 @@ class CheckWindow(QWidget):
|
|
150
153
|
self.clear_lists()
|
151
154
|
if json_data.get("cmd", "") == "CALLCHANGED":
|
152
155
|
call = json_data.get("call", "")
|
156
|
+
self.call = call
|
153
157
|
self.master_list(call)
|
154
158
|
self.log_list(call)
|
155
159
|
continue
|
156
160
|
if json_data.get("cmd", "") == "CHECKSPOTS":
|
157
|
-
self.
|
161
|
+
self.populate_layout(self.dxcLayout, [])
|
158
162
|
spots = json_data.get("spots", [])
|
159
163
|
self.telnet_list(spots)
|
160
164
|
continue
|
@@ -177,10 +181,9 @@ class CheckWindow(QWidget):
|
|
177
181
|
-------
|
178
182
|
None
|
179
183
|
"""
|
180
|
-
self.
|
181
|
-
self.
|
182
|
-
self.
|
183
|
-
self.callhistoryList.clear()
|
184
|
+
self.populate_layout(self.masterLayout, [])
|
185
|
+
self.populate_layout(self.qsoLayout, [])
|
186
|
+
self.populate_layout(self.dxcLayout, [])
|
184
187
|
|
185
188
|
def master_list(self, call: str) -> None:
|
186
189
|
"""
|
@@ -195,13 +198,9 @@ class CheckWindow(QWidget):
|
|
195
198
|
-------
|
196
199
|
None
|
197
200
|
"""
|
201
|
+
self.populate_layout(self.masterLayout, [])
|
198
202
|
results = self.mscp.super_check(call)
|
199
|
-
self.
|
200
|
-
for item in results:
|
201
|
-
if "#" in item:
|
202
|
-
continue
|
203
|
-
self.masterList.addItem(item)
|
204
|
-
self.masterList.show()
|
203
|
+
self.populate_layout(self.masterLayout, filter(lambda x: "#" not in x, results))
|
205
204
|
|
206
205
|
def log_list(self, call: str) -> None:
|
207
206
|
"""
|
@@ -216,11 +215,10 @@ class CheckWindow(QWidget):
|
|
216
215
|
-------
|
217
216
|
None
|
218
217
|
"""
|
219
|
-
self.
|
218
|
+
self.populate_layout(self.qsoLayout, [])
|
220
219
|
if call:
|
221
220
|
result = self.database.get_like_calls_and_bands(call)
|
222
|
-
self.
|
223
|
-
self.logList.show()
|
221
|
+
self.populate_layout(self.qsoLayout, result)
|
224
222
|
|
225
223
|
def telnet_list(self, spots: list) -> None:
|
226
224
|
"""
|
@@ -235,9 +233,62 @@ class CheckWindow(QWidget):
|
|
235
233
|
-------
|
236
234
|
None
|
237
235
|
"""
|
238
|
-
self.
|
236
|
+
self.populate_layout(self.dxcLayout, [])
|
239
237
|
if spots:
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
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)
|
not1mm/data/checkwindow.ui
CHANGED
@@ -1,119 +1,171 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<ui version="4.0">
|
3
|
-
<class>
|
4
|
-
<widget class="
|
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>
|
10
|
-
<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>
|
22
|
+
<string>CheckPartial</string>
|
21
23
|
</property>
|
22
|
-
<
|
23
|
-
<
|
24
|
-
<
|
25
|
-
|
26
|
-
|
27
|
-
<
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
<
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
<
|
67
|
-
<
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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>
|
4
|
-
<widget class="
|
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>
|
10
|
-
<height>
|
9
|
+
<width>818</width>
|
10
|
+
<height>374</height>
|
11
11
|
</rect>
|
12
12
|
</property>
|
13
13
|
<property name="windowTitle">
|
14
|
-
<string>
|
14
|
+
<string>DockWidget</string>
|
15
15
|
</property>
|
16
|
-
<
|
17
|
-
<
|
18
|
-
<
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
</
|
61
|
-
</
|
62
|
-
</
|
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>
|
4
|
-
<widget class="
|
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>
|
10
|
-
<height>
|
9
|
+
<width>304</width>
|
10
|
+
<height>132</height>
|
11
11
|
</rect>
|
12
12
|
</property>
|
13
13
|
<property name="windowTitle">
|
14
|
-
<string>
|
14
|
+
<string>DockWidget</string>
|
15
15
|
</property>
|
16
|
-
<
|
17
|
-
<
|
18
|
-
<
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
<
|
24
|
-
<
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
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(
|
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(
|
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.4.1
|
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
|
|
@@ -176,6 +177,7 @@ I wish to thank those who've contributed to the project.
|
|
176
177
|
|
177
178
|
## Recent Changes
|
178
179
|
|
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.
|
179
181
|
- [24-4-1] Removed some un-needed loops and widgets from the check window.
|
180
182
|
|
181
183
|
See [CHANGELOG.md](CHANGELOG.md) for prior changes.
|
@@ -1,17 +1,17 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
2
|
+
not1mm/__main__.py,sha256=y7pJidcDn71lr-JLfZPQSqPDNgbrImeIgKgvJNhVrb8,117984
|
3
3
|
not1mm/bandmap.py,sha256=a0QZj0HvPh8ixj207ANRHO29aKN3YMKolp_P47gSOtI,33404
|
4
|
-
not1mm/checkwindow.py,sha256=
|
4
|
+
not1mm/checkwindow.py,sha256=3m3rYItlWtbnRWxI_k1ECmweuVJtf0W2tU1NjL6a8FU,9657
|
5
5
|
not1mm/fsutils.py,sha256=Li8Tq9K7c_q7onOHOQ7u1dOOFfhIIz5Aj2LKuQtGOO4,1652
|
6
|
-
not1mm/logwindow.py,sha256=
|
7
|
-
not1mm/vfo.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.4.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
141
|
-
not1mm-24.4.1.dist-info/METADATA,sha256=
|
142
|
-
not1mm-24.4.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
143
|
-
not1mm-24.4.1.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
144
|
-
not1mm-24.4.1.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
145
|
-
not1mm-24.4.1.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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|