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 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,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(QWidget):
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.text()
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.telnetList.clear()
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.logList.clear()
181
- self.masterList.clear()
182
- self.telnetList.clear()
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.masterList.clear()
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.logList.clear()
218
+ self.populate_layout(self.qsoLayout, [])
220
219
  if call:
221
220
  result = self.database.get_like_calls_and_bands(call)
222
- self.logList.addItems(result)
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.telnetList.clear()
236
+ self.populate_layout(self.dxcLayout, [])
239
237
  if spots:
240
- for calls in spots:
241
- call = calls.get("callsign", "")
242
- self.telnetList.addItem(call)
243
- 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.4.1"
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.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=GhgvGedPUhRoahp924Qi6fAwbenCmuJXiE5F5pyuRHg,118379
2
+ not1mm/__main__.py,sha256=y7pJidcDn71lr-JLfZPQSqPDNgbrImeIgKgvJNhVrb8,117984
3
3
  not1mm/bandmap.py,sha256=a0QZj0HvPh8ixj207ANRHO29aKN3YMKolp_P47gSOtI,33404
4
- not1mm/checkwindow.py,sha256=fDCKpDQ3bO_g5M88qUKO6Xz-ZuMOxphUgZcUxRh69So,7604
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=zyPYRGlb6qNTLHKshHMd9CAwvJzBXvKiaRdBpQav138,47
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=a_dOeboBd2iCbbCsD6NFbGEV16tvyeIt2leV3jxC1-s,26175
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,,