not1mm 24.4.1.2__tar.gz → 24.4.2.1__tar.gz

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.
Files changed (152) hide show
  1. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/PKG-INFO +9 -8
  2. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/README.md +7 -6
  3. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/__main__.py +137 -90
  4. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/bandmap.py +50 -23
  5. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/checkwindow.py +45 -21
  6. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/checkwindow.ui +1 -1
  7. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/cty.json +1 -1
  8. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/vfo.ui +18 -0
  9. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/about.py +1 -1
  10. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/edit_contact.py +1 -1
  11. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/edit_macro.py +1 -1
  12. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/edit_opon.py +1 -1
  13. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/edit_station.py +2 -1
  14. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/lookup.py +6 -0
  15. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/multicast.py +7 -5
  16. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/new_contest.py +1 -1
  17. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/select_contest.py +1 -1
  18. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/settings.py +1 -1
  19. not1mm-24.4.2.1/not1mm/lib/version.py +3 -0
  20. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/logwindow.py +59 -23
  21. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/10_10_fall_cw.py +1 -1
  22. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/10_10_spring_cw.py +1 -2
  23. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/10_10_summer_phone.py +1 -1
  24. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/10_10_winter_phone.py +1 -1
  25. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_10m.py +1 -1
  26. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_dx_cw.py +1 -1
  27. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_dx_ssb.py +1 -1
  28. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_field_day.py +1 -1
  29. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_rtty_ru.py +1 -1
  30. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_ss_cw.py +3 -3
  31. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_ss_phone.py +3 -3
  32. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_vhf_jan.py +1 -1
  33. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_vhf_jun.py +1 -1
  34. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/arrl_vhf_sep.py +1 -1
  35. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/canada_day.py +1 -1
  36. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cq_160_cw.py +1 -1
  37. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cq_160_ssb.py +1 -1
  38. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cq_wpx_cw.py +1 -1
  39. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cq_wpx_ssb.py +1 -1
  40. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cq_ww_cw.py +1 -1
  41. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cq_ww_ssb.py +1 -1
  42. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/cwt.py +1 -1
  43. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/general_logging.py +1 -1
  44. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/iaru_hf.py +1 -1
  45. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/jidx_cw.py +1 -1
  46. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/jidx_ph.py +1 -1
  47. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/naqp_cw.py +1 -1
  48. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/naqp_ssb.py +1 -1
  49. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/phone_weekly_test.py +1 -1
  50. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/stew_perry_topband.py +1 -1
  51. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/winter_field_day.py +1 -1
  52. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/vfo.py +55 -25
  53. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm.egg-info/PKG-INFO +9 -8
  54. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm.egg-info/requires.txt +1 -1
  55. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/pyproject.toml +2 -2
  56. not1mm-24.4.1.2/not1mm/lib/version.py +0 -3
  57. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/LICENSE +0 -0
  58. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/__init__.py +0 -0
  59. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  60. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/MASTER.SCP +0 -0
  61. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/about.ui +0 -0
  62. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  63. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/bandmap.ui +0 -0
  64. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/check.png +0 -0
  65. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/configuration.ui +0 -0
  66. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/contests.sql +0 -0
  67. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/cwmacros.txt +0 -0
  68. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/donors.html +0 -0
  69. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/editcontact.ui +0 -0
  70. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/editmacro.ui +0 -0
  71. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/greendot.png +0 -0
  72. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/k6gte-not1mm.desktop +0 -0
  73. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/k6gte.not1mm-128.png +0 -0
  74. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/k6gte.not1mm-32.png +0 -0
  75. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/k6gte.not1mm-64.png +0 -0
  76. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/logwindow.ui +0 -0
  77. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/logwindowx.ui +0 -0
  78. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/main.ui +0 -0
  79. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/new_contest.ui +0 -0
  80. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/not1mm.html +0 -0
  81. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/opon.ui +0 -0
  82. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/0.wav +0 -0
  83. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/1.wav +0 -0
  84. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/2.wav +0 -0
  85. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/3.wav +0 -0
  86. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/4.wav +0 -0
  87. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/5.wav +0 -0
  88. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/6.wav +0 -0
  89. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/7.wav +0 -0
  90. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/73.wav +0 -0
  91. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/8.wav +0 -0
  92. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/9.wav +0 -0
  93. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/a.wav +0 -0
  94. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/again.wav +0 -0
  95. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/b.wav +0 -0
  96. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/c.wav +0 -0
  97. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/contest.wav +0 -0
  98. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/cq.wav +0 -0
  99. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/d.wav +0 -0
  100. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/e.wav +0 -0
  101. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/f.wav +0 -0
  102. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/g.wav +0 -0
  103. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/h.wav +0 -0
  104. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/i.wav +0 -0
  105. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/j.wav +0 -0
  106. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/k.wav +0 -0
  107. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/k6gte.wav +0 -0
  108. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/l.wav +0 -0
  109. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/m.wav +0 -0
  110. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/mynumber.wav +0 -0
  111. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/n.wav +0 -0
  112. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/nil.wav +0 -0
  113. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/o.wav +0 -0
  114. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/p.wav +0 -0
  115. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/q.wav +0 -0
  116. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/r.wav +0 -0
  117. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/roger.wav +0 -0
  118. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/s.wav +0 -0
  119. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/space.wav +0 -0
  120. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/t.wav +0 -0
  121. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/thankyou.wav +0 -0
  122. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  123. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/u.wav +0 -0
  124. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/v.wav +0 -0
  125. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/w.wav +0 -0
  126. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/x.wav +0 -0
  127. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/y.wav +0 -0
  128. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/yourcall.wav +0 -0
  129. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/phonetics/z.wav +0 -0
  130. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/pickcontest.ui +0 -0
  131. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/radio_green.png +0 -0
  132. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/radio_grey.png +0 -0
  133. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/radio_red.png +0 -0
  134. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/reddot.png +0 -0
  135. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/settings.ui +0 -0
  136. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/data/ssbmacros.txt +0 -0
  137. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/fsutils.py +0 -0
  138. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/__init__.py +0 -0
  139. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/cat_interface.py +0 -0
  140. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/cwinterface.py +0 -0
  141. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/database.py +0 -0
  142. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/ham_utility.py +0 -0
  143. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/n1mm.py +0 -0
  144. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/plugin_common.py +0 -0
  145. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/super_check_partial.py +0 -0
  146. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/lib/versiontest.py +0 -0
  147. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm/plugins/__init__.py +0 -0
  148. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm.egg-info/SOURCES.txt +0 -0
  149. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm.egg-info/dependency_links.txt +0 -0
  150. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm.egg-info/entry_points.txt +0 -0
  151. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/not1mm.egg-info/top_level.txt +0 -0
  152. {not1mm-24.4.1.2 → not1mm-24.4.2.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.4.1.2
3
+ Version: 24.4.2.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
@@ -16,7 +16,7 @@ Classifier: Topic :: Communications :: Ham Radio
16
16
  Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
- Requires-Dist: PyQt5
19
+ Requires-Dist: PyQt6
20
20
  Requires-Dist: requests
21
21
  Requires-Dist: dicttoxml
22
22
  Requires-Dist: xmltodict
@@ -32,17 +32,17 @@ Requires-Dist: Levenshtein
32
32
 
33
33
  # Not1MM
34
34
 
35
- The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
35
+ ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
36
+
37
+ The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
36
38
 
37
39
  [![PyPI](https://img.shields.io/pypi/v/not1mm)](https://pypi.org/project/not1mm/)
38
40
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
39
41
  [![Python: 3.10+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
40
- [![Made With:PyQt5](https://img.shields.io/badge/Made%20with-PyQt5-red)](https://pypi.org/project/PyQt5/)
42
+ [![Made With:PyQt6](https://img.shields.io/badge/Made%20with-PyQt6-blue)](https://pypi.org/project/PyQt6/)
41
43
  [![Code Maturity:Snot Nosed](https://img.shields.io/badge/Code%20Maturity-Snot%20Nosed-red)](https://xkcd.com/1695/)
42
44
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/not1mm)](https://pypi.org/project/not1mm/)
43
45
 
44
- ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
45
-
46
46
  - [Not1MM](#not1mm)
47
47
  - [What and why is Not1MM](#what-and-why-is-not1mm)
48
48
  - [Current state](#current-state)
@@ -177,6 +177,7 @@ I wish to thank those who've contributed to the project.
177
177
 
178
178
  ## Recent Changes
179
179
 
180
+ - [24-4-2] Migrated to PyQt6. I'm sure there are broken things.
180
181
  - [24-4-1-2] 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. Refocus call field after double clicking on item in the check partial window.
181
182
  - [24-4-1] Removed some un-needed loops and widgets from the check window. Fixed docking to the left side.
182
183
 
@@ -193,7 +194,7 @@ clue me into the black magic needed to get it to work.
193
194
 
194
195
  ### Prerequisites
195
196
 
196
- not1mm requires Python 3.9+, PyQt5 and libportaudio2. You should install these
197
+ not1mm requires Python 3.9+, PyQt6 and libportaudio2. You should install these
197
198
  through your distribution's package manager before continuing.
198
199
 
199
200
  ### Common installation recipes for Ubuntu and Fedora
@@ -206,7 +207,7 @@ noted the minimum steps needed to install not1mm.
206
207
  ```bash
207
208
  sudo apt update
208
209
  sudo apt upgrade
209
- sudo apt install -y libportaudio2 python3-pip python3-pyqt5 python3-numpy
210
+ sudo apt install -y libportaudio2 python3-pip python3-pyqt6 python3-numpy
210
211
  pip install -U not1mm
211
212
  ```
212
213
 
@@ -1,16 +1,16 @@
1
1
  # Not1MM
2
2
 
3
- The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
3
+ ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
4
+
5
+ The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
4
6
 
5
7
  [![PyPI](https://img.shields.io/pypi/v/not1mm)](https://pypi.org/project/not1mm/)
6
8
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
7
9
  [![Python: 3.10+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
8
- [![Made With:PyQt5](https://img.shields.io/badge/Made%20with-PyQt5-red)](https://pypi.org/project/PyQt5/)
10
+ [![Made With:PyQt6](https://img.shields.io/badge/Made%20with-PyQt6-blue)](https://pypi.org/project/PyQt6/)
9
11
  [![Code Maturity:Snot Nosed](https://img.shields.io/badge/Code%20Maturity-Snot%20Nosed-red)](https://xkcd.com/1695/)
10
12
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/not1mm)](https://pypi.org/project/not1mm/)
11
13
 
12
- ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
13
-
14
14
  - [Not1MM](#not1mm)
15
15
  - [What and why is Not1MM](#what-and-why-is-not1mm)
16
16
  - [Current state](#current-state)
@@ -145,6 +145,7 @@ I wish to thank those who've contributed to the project.
145
145
 
146
146
  ## Recent Changes
147
147
 
148
+ - [24-4-2] Migrated to PyQt6. I'm sure there are broken things.
148
149
  - [24-4-1-2] 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. Refocus call field after double clicking on item in the check partial window.
149
150
  - [24-4-1] Removed some un-needed loops and widgets from the check window. Fixed docking to the left side.
150
151
 
@@ -161,7 +162,7 @@ clue me into the black magic needed to get it to work.
161
162
 
162
163
  ### Prerequisites
163
164
 
164
- not1mm requires Python 3.9+, PyQt5 and libportaudio2. You should install these
165
+ not1mm requires Python 3.9+, PyQt6 and libportaudio2. You should install these
165
166
  through your distribution's package manager before continuing.
166
167
 
167
168
  ### Common installation recipes for Ubuntu and Fedora
@@ -174,7 +175,7 @@ noted the minimum steps needed to install not1mm.
174
175
  ```bash
175
176
  sudo apt update
176
177
  sudo apt upgrade
177
- sudo apt install -y libportaudio2 python3-pip python3-pyqt5 python3-numpy
178
+ sudo apt install -y libportaudio2 python3-pip python3-pyqt6 python3-numpy
178
179
  pip install -U not1mm
179
180
  ```
180
181
 
@@ -18,7 +18,6 @@ import platform
18
18
  import re
19
19
  import socket
20
20
 
21
- # import subprocess
22
21
  import sys
23
22
  import threading
24
23
  import uuid
@@ -31,10 +30,10 @@ import notctyparser
31
30
  import psutil
32
31
  import sounddevice as sd
33
32
  import soundfile as sf
34
- from PyQt5 import QtCore, QtGui, QtWidgets, uic
35
- from PyQt5.QtCore import QDir, Qt
36
- from PyQt5.QtGui import QFontDatabase
37
- from PyQt5.QtWidgets import QFileDialog, QDockWidget
33
+ from PyQt6 import QtCore, QtGui, QtWidgets, uic
34
+ from PyQt6.QtCore import QDir, Qt
35
+ from PyQt6.QtGui import QFontDatabase, QColorConstants
36
+ from PyQt6.QtWidgets import QFileDialog
38
37
 
39
38
  from not1mm.lib.about import About
40
39
  from not1mm.lib.cat_interface import CAT
@@ -177,7 +176,7 @@ class MainWindow(QtWidgets.QMainWindow):
177
176
  cw_entry_visible = False
178
177
  last_focus = None
179
178
  oldtext = ""
180
- text_color = Qt.black
179
+ text_color = QColorConstants.Black
181
180
  current_palette = None
182
181
 
183
182
  log_window = None
@@ -188,10 +187,12 @@ class MainWindow(QtWidgets.QMainWindow):
188
187
  def __init__(self, *args, **kwargs):
189
188
  super().__init__(*args, **kwargs)
190
189
  logger.info("MainWindow: __init__")
191
- self.setCorner(Qt.TopRightCorner, Qt.RightDockWidgetArea)
192
- self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea)
193
- self.setCorner(Qt.TopLeftCorner, Qt.LeftDockWidgetArea)
194
- self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea)
190
+ self.setCorner(Qt.Corner.TopRightCorner, Qt.DockWidgetArea.RightDockWidgetArea)
191
+ self.setCorner(
192
+ Qt.Corner.BottomRightCorner, Qt.DockWidgetArea.RightDockWidgetArea
193
+ )
194
+ self.setCorner(Qt.Corner.TopLeftCorner, Qt.DockWidgetArea.LeftDockWidgetArea)
195
+ self.setCorner(Qt.Corner.BottomLeftCorner, Qt.DockWidgetArea.LeftDockWidgetArea)
195
196
  data_path = fsutils.APP_DATA_PATH / "main.ui"
196
197
  uic.loadUi(data_path, self)
197
198
  self.cw_entry.hide()
@@ -264,40 +265,40 @@ class MainWindow(QtWidgets.QMainWindow):
264
265
  self.radio_green = QtGui.QPixmap(str(icon_path / "radio_green.png"))
265
266
  self.radio_icon.setPixmap(self.radio_grey)
266
267
 
267
- self.F1.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
268
+ self.F1.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
268
269
  self.F1.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F1))
269
270
  self.F1.clicked.connect(lambda x: self.process_function_key(self.F1))
270
- self.F2.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
271
+ self.F2.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
271
272
  self.F2.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F2))
272
273
  self.F2.clicked.connect(lambda x: self.process_function_key(self.F2))
273
- self.F3.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
274
+ self.F3.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
274
275
  self.F3.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F3))
275
276
  self.F3.clicked.connect(lambda x: self.process_function_key(self.F3))
276
- self.F4.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
277
+ self.F4.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
277
278
  self.F4.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F4))
278
279
  self.F4.clicked.connect(lambda x: self.process_function_key(self.F4))
279
- self.F5.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
280
+ self.F5.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
280
281
  self.F5.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F5))
281
282
  self.F5.clicked.connect(lambda x: self.process_function_key(self.F5))
282
- self.F6.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
283
+ self.F6.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
283
284
  self.F6.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F6))
284
285
  self.F6.clicked.connect(lambda x: self.process_function_key(self.F6))
285
- self.F7.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
286
+ self.F7.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
286
287
  self.F7.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F7))
287
288
  self.F7.clicked.connect(lambda x: self.process_function_key(self.F7))
288
- self.F8.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
289
+ self.F8.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
289
290
  self.F8.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F8))
290
291
  self.F8.clicked.connect(lambda x: self.process_function_key(self.F8))
291
- self.F9.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
292
+ self.F9.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
292
293
  self.F9.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F9))
293
294
  self.F9.clicked.connect(lambda x: self.process_function_key(self.F9))
294
- self.F10.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
295
+ self.F10.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
295
296
  self.F10.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F10))
296
297
  self.F10.clicked.connect(lambda x: self.process_function_key(self.F10))
297
- self.F11.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
298
+ self.F11.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
298
299
  self.F11.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F11))
299
300
  self.F11.clicked.connect(lambda x: self.process_function_key(self.F11))
300
- self.F12.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
301
+ self.F12.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
301
302
  self.F12.customContextMenuRequested.connect(lambda x: self.edit_macro(self.F12))
302
303
  self.F12.clicked.connect(lambda x: self.process_function_key(self.F12))
303
304
 
@@ -505,25 +506,45 @@ class MainWindow(QtWidgets.QMainWindow):
505
506
  darkPalette = QtGui.QPalette()
506
507
  darkColor = QtGui.QColor(56, 56, 56)
507
508
  disabledColor = QtGui.QColor(127, 127, 127)
508
- darkPalette.setColor(QtGui.QPalette.Window, darkColor)
509
- darkPalette.setColor(QtGui.QPalette.WindowText, Qt.white)
510
- darkPalette.setColor(QtGui.QPalette.Base, QtGui.QColor(45, 45, 45))
511
- darkPalette.setColor(QtGui.QPalette.AlternateBase, darkColor)
512
- darkPalette.setColor(QtGui.QPalette.Text, Qt.white)
509
+ darkPalette.setColor(QtGui.QPalette.ColorRole.Window, darkColor)
510
+ darkPalette.setColor(
511
+ QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
512
+ )
513
+ darkPalette.setColor(
514
+ QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
515
+ )
516
+ darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
517
+ darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
518
+ darkPalette.setColor(
519
+ QtGui.QPalette.ColorGroup.Disabled,
520
+ QtGui.QPalette.ColorRole.Text,
521
+ disabledColor,
522
+ )
523
+ darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
524
+ darkPalette.setColor(
525
+ QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
526
+ )
513
527
  darkPalette.setColor(
514
- QtGui.QPalette.Disabled, QtGui.QPalette.Text, disabledColor
528
+ QtGui.QPalette.ColorGroup.Disabled,
529
+ QtGui.QPalette.ColorRole.ButtonText,
530
+ disabledColor,
515
531
  )
516
- darkPalette.setColor(QtGui.QPalette.Button, darkColor)
517
- darkPalette.setColor(QtGui.QPalette.ButtonText, Qt.white)
518
532
  darkPalette.setColor(
519
- QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, disabledColor
533
+ QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
520
534
  )
521
- darkPalette.setColor(QtGui.QPalette.BrightText, Qt.red)
522
- darkPalette.setColor(QtGui.QPalette.Link, QtGui.QColor(42, 130, 218))
523
- darkPalette.setColor(QtGui.QPalette.Highlight, QtGui.QColor(42, 130, 218))
524
- darkPalette.setColor(QtGui.QPalette.HighlightedText, Qt.black)
525
535
  darkPalette.setColor(
526
- QtGui.QPalette.Disabled, QtGui.QPalette.HighlightedText, disabledColor
536
+ QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
537
+ )
538
+ darkPalette.setColor(
539
+ QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
540
+ )
541
+ darkPalette.setColor(
542
+ QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
543
+ )
544
+ darkPalette.setColor(
545
+ QtGui.QPalette.ColorGroup.Disabled,
546
+ QtGui.QPalette.ColorRole.HighlightedText,
547
+ disabledColor,
527
548
  )
528
549
  dark_button_style = (
529
550
  "QPushButton {"
@@ -542,7 +563,7 @@ class MainWindow(QtWidgets.QMainWindow):
542
563
  )
543
564
  self.current_palette = darkPalette
544
565
  self.setPalette(darkPalette)
545
- self.text_color = Qt.white
566
+ self.text_color = QColorConstants.White
546
567
  self.menuFile.setPalette(darkPalette)
547
568
  self.menuHelp.setPalette(darkPalette)
548
569
  self.menuOther.setPalette(darkPalette)
@@ -581,7 +602,7 @@ class MainWindow(QtWidgets.QMainWindow):
581
602
  self.other_1.setPalette(palette)
582
603
  self.other_2.setPalette(palette)
583
604
  self.cw_entry.setPalette(palette)
584
- self.text_color = Qt.black
605
+ self.text_color = QColorConstants.Black
585
606
  light_button_style = (
586
607
  "QPushButton {"
587
608
  "background-color: rgb(245,245,245);"
@@ -750,11 +771,11 @@ class MainWindow(QtWidgets.QMainWindow):
750
771
  message_box = QtWidgets.QMessageBox()
751
772
  if self.current_palette:
752
773
  message_box.setPalette(self.current_palette)
753
- message_box.setIcon(QtWidgets.QMessageBox.Information)
774
+ message_box.setIcon(QtWidgets.QMessageBox.Icon.Information)
754
775
  message_box.setText(message)
755
776
  message_box.setWindowTitle("Information")
756
- message_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
757
- _ = message_box.exec_()
777
+ message_box.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
778
+ _ = message_box.exec()
758
779
 
759
780
  def show_about_dialog(self) -> None:
760
781
  """
@@ -1339,9 +1360,10 @@ class MainWindow(QtWidgets.QMainWindow):
1339
1360
  str: filename
1340
1361
  """
1341
1362
 
1342
- options = QFileDialog.Options()
1343
- options |= QFileDialog.DontUseNativeDialog
1344
- options |= QFileDialog.DontConfirmOverwrite
1363
+ options = (
1364
+ QFileDialog.Option.DontUseNativeDialog
1365
+ | QFileDialog.Option.DontConfirmOverwrite
1366
+ )
1345
1367
  if action == "new":
1346
1368
  file, _ = QFileDialog.getSaveFileName(
1347
1369
  self,
@@ -1367,30 +1389,34 @@ class MainWindow(QtWidgets.QMainWindow):
1367
1389
 
1368
1390
  def launch_log_window(self) -> None:
1369
1391
  """Launch the log window"""
1370
- if not self.log_window:
1371
- self.log_window = LogWindow()
1372
- self.addDockWidget(Qt.BottomDockWidgetArea, self.log_window)
1392
+ if self.log_window:
1393
+ self.log_window.close()
1394
+ self.log_window = LogWindow()
1395
+ self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, self.log_window)
1373
1396
  self.log_window.show()
1374
1397
 
1375
1398
  def launch_bandmap_window(self) -> None:
1376
1399
  """Launch the bandmap window"""
1377
- if not self.bandmap_window:
1378
- self.bandmap_window = BandMapWindow()
1379
- self.addDockWidget(Qt.RightDockWidgetArea, self.bandmap_window)
1400
+ if self.bandmap_window:
1401
+ self.bandmap_window.close()
1402
+ self.bandmap_window = BandMapWindow()
1403
+ self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.bandmap_window)
1380
1404
  self.bandmap_window.show()
1381
1405
 
1382
1406
  def launch_check_window(self) -> None:
1383
1407
  """Launch the check window"""
1384
- if not self.check_window:
1385
- self.check_window = CheckWindow()
1386
- self.addDockWidget(Qt.RightDockWidgetArea, self.check_window)
1408
+ if self.check_window:
1409
+ self.check_window.close()
1410
+ self.check_window = CheckWindow()
1411
+ self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.check_window)
1387
1412
  self.check_window.show()
1388
1413
 
1389
1414
  def launch_vfo(self) -> None:
1390
1415
  """Launch the VFO window"""
1391
- if not self.vfo_window:
1392
- self.vfo_window = VfoWindow()
1393
- self.addDockWidget(Qt.RightDockWidgetArea, self.vfo_window)
1416
+ if self.vfo_window:
1417
+ self.vfo_window.close()
1418
+ self.vfo_window = VfoWindow()
1419
+ self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.vfo_window)
1394
1420
  self.vfo_window.show()
1395
1421
 
1396
1422
  def clear_band_indicators(self) -> None:
@@ -1407,8 +1433,8 @@ class MainWindow(QtWidgets.QMainWindow):
1407
1433
  """
1408
1434
  for _, indicators in self.all_mode_indicators.items():
1409
1435
  for _, indicator in indicators.items():
1410
- indicator.setFrameShape(QtWidgets.QFrame.NoFrame)
1411
- if self.text_color == Qt.black:
1436
+ indicator.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
1437
+ if self.text_color == QColorConstants.Black:
1412
1438
  indicator.setStyleSheet(
1413
1439
  "font-family: JetBrains Mono; color: black;"
1414
1440
  )
@@ -1433,7 +1459,7 @@ class MainWindow(QtWidgets.QMainWindow):
1433
1459
  self.clear_band_indicators()
1434
1460
  indicator = self.all_mode_indicators[self.current_mode].get(band, None)
1435
1461
  if indicator:
1436
- indicator.setFrameShape(QtWidgets.QFrame.Box)
1462
+ indicator.setFrameShape(QtWidgets.QFrame.Shape.Box)
1437
1463
  indicator.setStyleSheet("font-family: JetBrains Mono; color: green;")
1438
1464
 
1439
1465
  def closeEvent(self, _event) -> None:
@@ -1522,7 +1548,10 @@ class MainWindow(QtWidgets.QMainWindow):
1522
1548
  if event.key() == Qt.Key.Key_K:
1523
1549
  self.toggle_cw_entry()
1524
1550
  return
1525
- if event.key() == Qt.Key_S and modifier == Qt.ControlModifier:
1551
+ if (
1552
+ event.key() == Qt.Key.Key_S
1553
+ and modifier == Qt.KeyboardModifier.ControlModifier
1554
+ ):
1526
1555
  freq = self.radio_state.get("vfoa")
1527
1556
  dx = self.callsign.text()
1528
1557
  if freq and dx:
@@ -1533,7 +1562,10 @@ class MainWindow(QtWidgets.QMainWindow):
1533
1562
  cmd["freq"] = float(int(freq) / 1000)
1534
1563
  self.multicast_interface.send_as_json(cmd)
1535
1564
  return
1536
- if event.key() == Qt.Key_M and modifier == Qt.ControlModifier:
1565
+ if (
1566
+ event.key() == Qt.Key.Key_M
1567
+ and modifier == Qt.KeyboardModifier.ControlModifier
1568
+ ):
1537
1569
  freq = self.radio_state.get("vfoa")
1538
1570
  dx = self.callsign.text()
1539
1571
  if freq and dx:
@@ -1544,7 +1576,10 @@ class MainWindow(QtWidgets.QMainWindow):
1544
1576
  cmd["freq"] = float(int(freq) / 1000)
1545
1577
  self.multicast_interface.send_as_json(cmd)
1546
1578
  return
1547
- if event.key() == Qt.Key_G and modifier == Qt.ControlModifier:
1579
+ if (
1580
+ event.key() == Qt.Key.Key_G
1581
+ and modifier == Qt.KeyboardModifier.ControlModifier
1582
+ ):
1548
1583
  dx = self.callsign.text()
1549
1584
  if dx:
1550
1585
  cmd = {}
@@ -1554,11 +1589,15 @@ class MainWindow(QtWidgets.QMainWindow):
1554
1589
  self.multicast_interface.send_as_json(cmd)
1555
1590
  return
1556
1591
  if (
1557
- event.key() == Qt.Key.Key_Escape and modifier != Qt.ControlModifier
1592
+ event.key() == Qt.Key.Key_Escape
1593
+ and modifier != Qt.KeyboardModifier.ControlModifier
1558
1594
  ): # pylint: disable=no-member
1559
1595
  self.clearinputs()
1560
1596
  return
1561
- if event.key() == Qt.Key.Key_Escape and modifier == Qt.ControlModifier:
1597
+ if (
1598
+ event.key() == Qt.Key.Key_Escape
1599
+ and modifier == Qt.KeyboardModifier.ControlModifier
1600
+ ):
1562
1601
  if self.cw is not None:
1563
1602
  if self.cw.servertype == 1:
1564
1603
  self.cw.sendcw("\x1b4")
@@ -1575,7 +1614,10 @@ class MainWindow(QtWidgets.QMainWindow):
1575
1614
  cmd["station"] = platform.node()
1576
1615
  self.multicast_interface.send_as_json(cmd)
1577
1616
  return
1578
- if event.key() == Qt.Key.Key_PageUp and modifier != Qt.ControlModifier:
1617
+ if (
1618
+ event.key() == Qt.Key.Key_PageUp
1619
+ and modifier != Qt.KeyboardModifier.ControlModifier
1620
+ ):
1579
1621
  if self.cw is not None:
1580
1622
  self.cw.speed += 1
1581
1623
  self.cw_speed.setValue(self.cw.speed)
@@ -1584,7 +1626,10 @@ class MainWindow(QtWidgets.QMainWindow):
1584
1626
  if self.cw.servertype == 2:
1585
1627
  self.cw.set_winkeyer_speed(self.cw_speed.value())
1586
1628
  return
1587
- if event.key() == Qt.Key.Key_PageDown and modifier != Qt.ControlModifier:
1629
+ if (
1630
+ event.key() == Qt.Key.Key_PageDown
1631
+ and modifier != Qt.KeyboardModifier.ControlModifier
1632
+ ):
1588
1633
  if self.cw is not None:
1589
1634
  self.cw.speed -= 1
1590
1635
  self.cw_speed.setValue(self.cw.speed)
@@ -1596,7 +1641,7 @@ class MainWindow(QtWidgets.QMainWindow):
1596
1641
  if event.key() == Qt.Key.Key_Tab or event.key() == Qt.Key.Key_Backtab:
1597
1642
  if self.sent.hasFocus():
1598
1643
  logger.debug("From sent")
1599
- if modifier == Qt.ShiftModifier:
1644
+ if modifier == Qt.KeyboardModifier.ShiftModifier:
1600
1645
  prev_tab = self.tab_prev.get(self.sent)
1601
1646
  prev_tab.setFocus()
1602
1647
  prev_tab.deselect()
@@ -1609,7 +1654,7 @@ class MainWindow(QtWidgets.QMainWindow):
1609
1654
  return
1610
1655
  if self.receive.hasFocus():
1611
1656
  logger.debug("From receive")
1612
- if modifier == Qt.ShiftModifier:
1657
+ if modifier == Qt.KeyboardModifier.ShiftModifier:
1613
1658
  prev_tab = self.tab_prev.get(self.receive)
1614
1659
  prev_tab.setFocus()
1615
1660
  prev_tab.deselect()
@@ -1622,7 +1667,7 @@ class MainWindow(QtWidgets.QMainWindow):
1622
1667
  return
1623
1668
  if self.other_1.hasFocus():
1624
1669
  logger.debug("From other_1")
1625
- if modifier == Qt.ShiftModifier:
1670
+ if modifier == Qt.KeyboardModifier.ShiftModifier:
1626
1671
  prev_tab = self.tab_prev.get(self.other_1)
1627
1672
  prev_tab.setFocus()
1628
1673
  prev_tab.deselect()
@@ -1635,7 +1680,7 @@ class MainWindow(QtWidgets.QMainWindow):
1635
1680
  return
1636
1681
  if self.other_2.hasFocus():
1637
1682
  logger.debug("From other_2")
1638
- if modifier == Qt.ShiftModifier:
1683
+ if modifier == Qt.KeyboardModifier.ShiftModifier:
1639
1684
  prev_tab = self.tab_prev.get(self.other_2)
1640
1685
  prev_tab.setFocus()
1641
1686
  prev_tab.deselect()
@@ -1653,7 +1698,7 @@ class MainWindow(QtWidgets.QMainWindow):
1653
1698
  self.dupe_indicator.show()
1654
1699
  else:
1655
1700
  self.dupe_indicator.hide()
1656
- if modifier == Qt.ShiftModifier:
1701
+ if modifier == Qt.KeyboardModifier.ShiftModifier:
1657
1702
  prev_tab = self.tab_prev.get(self.callsign)
1658
1703
  prev_tab.setFocus()
1659
1704
  prev_tab.deselect()
@@ -1672,29 +1717,29 @@ class MainWindow(QtWidgets.QMainWindow):
1672
1717
  next_tab.deselect()
1673
1718
  next_tab.end(False)
1674
1719
  return
1675
- if event.key() == Qt.Key_F1:
1720
+ if event.key() == Qt.Key.Key_F1:
1676
1721
  self.process_function_key(self.F1)
1677
- if event.key() == Qt.Key_F2:
1722
+ if event.key() == Qt.Key.Key_F2:
1678
1723
  self.process_function_key(self.F2)
1679
- if event.key() == Qt.Key_F3:
1724
+ if event.key() == Qt.Key.Key_F3:
1680
1725
  self.process_function_key(self.F3)
1681
- if event.key() == Qt.Key_F4:
1726
+ if event.key() == Qt.Key.Key_F4:
1682
1727
  self.process_function_key(self.F4)
1683
- if event.key() == Qt.Key_F5:
1728
+ if event.key() == Qt.Key.Key_F5:
1684
1729
  self.process_function_key(self.F5)
1685
- if event.key() == Qt.Key_F6:
1730
+ if event.key() == Qt.Key.Key_F6:
1686
1731
  self.process_function_key(self.F6)
1687
- if event.key() == Qt.Key_F7:
1732
+ if event.key() == Qt.Key.Key_F7:
1688
1733
  self.process_function_key(self.F7)
1689
- if event.key() == Qt.Key_F8:
1734
+ if event.key() == Qt.Key.Key_F8:
1690
1735
  self.process_function_key(self.F8)
1691
- if event.key() == Qt.Key_F9:
1736
+ if event.key() == Qt.Key.Key_F9:
1692
1737
  self.process_function_key(self.F9)
1693
- if event.key() == Qt.Key_F10:
1738
+ if event.key() == Qt.Key.Key_F10:
1694
1739
  self.process_function_key(self.F10)
1695
- if event.key() == Qt.Key_F11:
1740
+ if event.key() == Qt.Key.Key_F11:
1696
1741
  self.process_function_key(self.F11)
1697
- if event.key() == Qt.Key_F12:
1742
+ if event.key() == Qt.Key.Key_F12:
1698
1743
  self.process_function_key(self.F12)
1699
1744
 
1700
1745
  def set_window_title(self) -> None:
@@ -2905,12 +2950,14 @@ class MainWindow(QtWidgets.QMainWindow):
2905
2950
  debug_response = f"{response}"
2906
2951
  logger.debug("The Response: %s\n", debug_response)
2907
2952
  if response:
2908
- theirgrid = response.get("grid")
2953
+ theirgrid = response.get("grid", "")
2909
2954
  self.contact["GridSquare"] = theirgrid
2910
- _theircountry = response.get("country")
2955
+ _theircountry = response.get("country", "")
2911
2956
  if self.station.get("GridSquare", ""):
2912
2957
  heading = bearing(self.station.get("GridSquare", ""), theirgrid)
2913
- kilometers = distance(self.station.get("GridSquare"), theirgrid)
2958
+ kilometers = distance(
2959
+ self.station.get("GridSquare", ""), theirgrid
2960
+ )
2914
2961
  self.heading_distance.setText(
2915
2962
  f"{theirgrid} Hdg {heading}° LP {reciprocol(heading)}° / "
2916
2963
  f"distance {int(kilometers*0.621371)}mi {kilometers}km"
@@ -3267,18 +3314,18 @@ def install_icons() -> None:
3267
3314
  if sys.platform == "linux":
3268
3315
  os.system(
3269
3316
  "xdg-icon-resource install --size 32 --context apps --mode user "
3270
- f"{fsutils.MODULE_PATH}/data/k6gte.not1mm-32.png k6gte-not1mm"
3317
+ f"{fsutils.APP_DATA_PATH}/k6gte.not1mm-32.png k6gte-not1mm"
3271
3318
  )
3272
3319
  os.system(
3273
3320
  "xdg-icon-resource install --size 64 --context apps --mode user "
3274
- f"{fsutils.MODULE_PATH}/data/k6gte.not1mm-64.png k6gte-not1mm"
3321
+ f"{fsutils.APP_DATA_PATH}/k6gte.not1mm-64.png k6gte-not1mm"
3275
3322
  )
3276
3323
  os.system(
3277
3324
  "xdg-icon-resource install --size 128 --context apps --mode user "
3278
- f"{fsutils.MODULE_PATH}/data/k6gte.not1mm-128.png k6gte-not1mm"
3325
+ f"{fsutils.APP_DATA_PATH}/k6gte.not1mm-128.png k6gte-not1mm"
3279
3326
  )
3280
3327
  os.system(
3281
- f"xdg-desktop-menu install {fsutils.MODULE_PATH}/data/k6gte-not1mm.desktop"
3328
+ f"xdg-desktop-menu install {fsutils.APP_DATA_PATH}/k6gte-not1mm.desktop"
3282
3329
  )
3283
3330
 
3284
3331