not1mm 25.5.14__tar.gz → 25.5.21__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 (194) hide show
  1. {not1mm-25.5.14 → not1mm-25.5.21}/PKG-INFO +38 -2
  2. {not1mm-25.5.14 → not1mm-25.5.21}/README.md +37 -1
  3. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/__main__.py +76 -26
  4. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/bandmap.py +5 -1
  5. not1mm-25.5.21/not1mm/data/JetBrainsMono-Thin.ttf +0 -0
  6. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/about.ui +1 -1
  7. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/bandmap.ui +4 -4
  8. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/checkwindow.ui +7 -7
  9. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/configuration.ui +55 -55
  10. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/editcontact.ui +3 -3
  11. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/editmacro.ui +1 -1
  12. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/logwindow.ui +2 -2
  13. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/logwindowx.ui +2 -2
  14. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/main.ui +36 -36
  15. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/new_contest.ui +2 -2
  16. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/opon.ui +1 -1
  17. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/pickcontest.ui +1 -1
  18. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/ratewindow.ui +2 -2
  19. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/settings.ui +1 -1
  20. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/statistics.ui +1 -1
  21. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/vfo.ui +2 -2
  22. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/version.py +1 -1
  23. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm.egg-info/PKG-INFO +38 -2
  24. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm.egg-info/SOURCES.txt +1 -1
  25. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm.egg-info/top_level.txt +1 -0
  26. {not1mm-25.5.14 → not1mm-25.5.21}/pyproject.toml +1 -1
  27. not1mm-25.5.14/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
  28. {not1mm-25.5.14 → not1mm-25.5.21}/LICENSE +0 -0
  29. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/__init__.py +0 -0
  30. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/checkwindow.py +0 -0
  31. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/MASTER.SCP +0 -0
  32. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  33. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/check.png +0 -0
  34. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/contests.sql +0 -0
  35. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/cty.json +0 -0
  36. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/cwmacros.txt +0 -0
  37. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/donors.html +0 -0
  38. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/greendot.png +0 -0
  39. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/k6gte-not1mm.desktop +0 -0
  40. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/k6gte.not1mm-128.png +0 -0
  41. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/k6gte.not1mm-32.png +0 -0
  42. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/k6gte.not1mm-64.png +0 -0
  43. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/not1mm.html +0 -0
  44. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/0.wav +0 -0
  45. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/1.wav +0 -0
  46. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/2.wav +0 -0
  47. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/3.wav +0 -0
  48. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/4.wav +0 -0
  49. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/5.wav +0 -0
  50. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/6.wav +0 -0
  51. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/7.wav +0 -0
  52. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/73.wav +0 -0
  53. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/8.wav +0 -0
  54. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/9.wav +0 -0
  55. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/a.wav +0 -0
  56. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/again.wav +0 -0
  57. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/b.wav +0 -0
  58. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/c.wav +0 -0
  59. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/contest.wav +0 -0
  60. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/cq.wav +0 -0
  61. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/cq2.wav +0 -0
  62. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/d.wav +0 -0
  63. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/e.wav +0 -0
  64. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/f.wav +0 -0
  65. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/g.wav +0 -0
  66. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/h.wav +0 -0
  67. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/i.wav +0 -0
  68. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/j.wav +0 -0
  69. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/k.wav +0 -0
  70. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/k6gte.wav +0 -0
  71. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/l.wav +0 -0
  72. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/m.wav +0 -0
  73. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/mynumber.wav +0 -0
  74. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/n.wav +0 -0
  75. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/nil.wav +0 -0
  76. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/o.wav +0 -0
  77. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/p.wav +0 -0
  78. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/q.wav +0 -0
  79. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/r.wav +0 -0
  80. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/roger.wav +0 -0
  81. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/s.wav +0 -0
  82. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/space.wav +0 -0
  83. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/t.wav +0 -0
  84. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/thankyou.wav +0 -0
  85. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  86. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/u.wav +0 -0
  87. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/v.wav +0 -0
  88. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/w.wav +0 -0
  89. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/x.wav +0 -0
  90. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/y.wav +0 -0
  91. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/yourcall.wav +0 -0
  92. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/phonetics/z.wav +0 -0
  93. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/radio_green.png +0 -0
  94. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/radio_grey.png +0 -0
  95. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/radio_red.png +0 -0
  96. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/reddot.png +0 -0
  97. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/rttymacros.txt +0 -0
  98. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/splash.png +0 -0
  99. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/data/ssbmacros.txt +0 -0
  100. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/fsutils.py +0 -0
  101. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/__init__.py +0 -0
  102. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/about.py +0 -0
  103. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/cat_interface.py +0 -0
  104. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/cwinterface.py +0 -0
  105. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/database.py +0 -0
  106. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/edit_contact.py +0 -0
  107. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/edit_macro.py +0 -0
  108. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/edit_opon.py +0 -0
  109. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/edit_station.py +0 -0
  110. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/fldigi_sendstring.py +0 -0
  111. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/ft8_watcher.py +0 -0
  112. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/ham_utility.py +0 -0
  113. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/lookup.py +0 -0
  114. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/multicast.py +0 -0
  115. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/n1mm.py +0 -0
  116. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/new_contest.py +0 -0
  117. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/plugin_common.py +0 -0
  118. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/select_contest.py +0 -0
  119. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/settings.py +0 -0
  120. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/super_check_partial.py +0 -0
  121. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lib/versiontest.py +0 -0
  122. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/logwindow.py +0 -0
  123. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/lookupservice.py +0 -0
  124. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/10_10_fall_cw.py +0 -0
  125. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/10_10_spring_cw.py +0 -0
  126. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/10_10_summer_phone.py +0 -0
  127. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/10_10_winter_phone.py +0 -0
  128. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/__init__.py +0 -0
  129. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ari_40_80.py +0 -0
  130. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_10m.py +0 -0
  131. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_160m.py +0 -0
  132. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_dx_cw.py +0 -0
  133. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  134. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_field_day.py +0 -0
  135. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  136. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_ss_cw.py +0 -0
  137. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_ss_phone.py +0 -0
  138. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  139. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  140. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  141. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/canada_day.py +0 -0
  142. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_160_cw.py +0 -0
  143. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_160_ssb.py +0 -0
  144. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_wpx_cw.py +0 -0
  145. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_wpx_rtty.py +0 -0
  146. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  147. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_ww_cw.py +0 -0
  148. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_ww_rtty.py +0 -0
  149. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cq_ww_ssb.py +0 -0
  150. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/cwt.py +0 -0
  151. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/darc_vhf.py +0 -0
  152. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/darc_xmas.py +0 -0
  153. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ea_majistad_cw.py +0 -0
  154. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ea_majistad_ssb.py +0 -0
  155. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ea_rtty.py +0 -0
  156. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/es_open.py +0 -0
  157. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/general_logging.py +0 -0
  158. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/helvetia.py +0 -0
  159. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
  160. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
  161. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/iaru_hf.py +0 -0
  162. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/icwc_mst.py +0 -0
  163. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/jidx_cw.py +0 -0
  164. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/jidx_ph.py +0 -0
  165. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/k1usn_sst.py +0 -0
  166. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/labre_rs_digi.py +0 -0
  167. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/lz-dx.py +0 -0
  168. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/naqp_cw.py +0 -0
  169. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/naqp_rtty.py +0 -0
  170. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/naqp_ssb.py +0 -0
  171. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/phone_weekly_test.py +0 -0
  172. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/raem.py +0 -0
  173. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/randomgram.py +0 -0
  174. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ref_cw.py +0 -0
  175. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ref_ssb.py +0 -0
  176. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/sac_cw.py +0 -0
  177. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/sac_ssb.py +0 -0
  178. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/spdx.py +0 -0
  179. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/stew_perry_topband.py +0 -0
  180. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/ukeidx.py +0 -0
  181. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/vhf_sprint.py +0 -0
  182. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/weekly_rtty.py +0 -0
  183. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/plugins/winter_field_day.py +0 -0
  184. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/radio.py +0 -0
  185. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/ratewindow.py +0 -0
  186. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/rtc_service.py +0 -0
  187. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/statistics.py +0 -0
  188. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/test.py +0 -0
  189. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/vfo.py +0 -0
  190. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm/voice_keying.py +0 -0
  191. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm.egg-info/dependency_links.txt +0 -0
  192. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm.egg-info/entry_points.txt +0 -0
  193. {not1mm-25.5.14 → not1mm-25.5.21}/not1mm.egg-info/requires.txt +0 -0
  194. {not1mm-25.5.14 → not1mm-25.5.21}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.5.14
3
+ Version: 25.5.21
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -62,6 +62,7 @@ Dynamic: license-file
62
62
  - [Flatpak](#flatpak)
63
63
  - [Installation](#installation)
64
64
  - [Prerequisites](#prerequisites)
65
+ - [The Easy and Fast way to always run the latest version](#the-easy-and-fast-way-to-always-run-the-latest-version)
65
66
  - [Common Installation Recipes for Ubuntu and Fedora](#common-installation-recipes-for-ubuntu-and-fedora)
66
67
  - [Ubuntu 22.04 LTS](#ubuntu-2204-lts)
67
68
  - [Ubuntu 23.04](#ubuntu-2304)
@@ -256,6 +257,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
256
257
 
257
258
  ## Recent Changes
258
259
 
260
+ -[25-5-21] Fix crash from unsafe dict key access when processing F1-F12.
259
261
  - [25-5-6] Merged PR from @JG3LLB, Koji-Kawano, Adding code to stop sending morse if using rigctld to send, and @alduhoo adding more control to CW serial number padding.
260
262
 
261
263
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -280,6 +282,40 @@ Not1MM requires:
280
282
 
281
283
  You should install these through your distribution's package manager before continuing.
282
284
 
285
+ ### The Easy and Fast way to always run the latest version
286
+
287
+ - Step 1. Visit [Astral](https://docs.astral.sh/uv/) and install uv.
288
+
289
+ In short you run this in your terminal:
290
+
291
+ ```bash
292
+ curl -LsSf https://astral.sh/uv/install.sh | sh
293
+ ```
294
+
295
+ - Step 2. Tell it to run not1mm:
296
+
297
+ ```bash
298
+ uv tool run not1mm
299
+ ```
300
+
301
+ That's it... It will go out, fetch the latest version of not1mm, setup a python virtual environment, get all the needed python libraries, cache everything and run not1mm. The first time takes a minute, but each time after, it's lightning quick and it will automatically check for updates and run the latest version.
302
+
303
+ But wait... There's more. If your distro is old and you're stuck with an older version of python... Say 3.10. And you want to see what all the cool kids are using. But you don't want to corrupt your broke ol' system by downloading the newest Python version. No problem. You can tell uv to run not1mm with any version of Python you'd like. Let's say 3.14.
304
+
305
+ ```bash
306
+ uv tool run --python 3.14 not1mm
307
+ ```
308
+
309
+ It'll download Python 3.14 into you virtual environment and run not1mm.
310
+
311
+ Let's say I was an idiot and pushed a new version and did't fully test it. This happens a-lot... We test in production. Or lets say you just want to see the pain that was back in 2023. No problem.
312
+
313
+ ```bash
314
+ uv tool run --python 3.10 not1mm==23.5.19
315
+ ```
316
+
317
+ Pow! Enjoy the pain... If uv is not your cuppa, you can follow the more traditional route below.
318
+
283
319
  ### Common Installation Recipes for Ubuntu and Fedora
284
320
 
285
321
  I've taken the time to install some common Linux distributions into a VM and
@@ -381,7 +417,7 @@ all the details from:
381
417
  In short, You should install stuff into a Python virtual environment. Newer
382
418
  Linux distros will make you do this unless you include a command line argument
383
419
  akin to '--break-my-system' when using pip. I'm not telling you to use pipx.
384
- But... **Use pipx**.
420
+ But... **Use pipx**. Or better visit the [section above](#the-easy-and-fast-way-to-always-run-the-latest-version) on using uv.
385
421
 
386
422
  #### Bootstrapping pipx
387
423
 
@@ -30,6 +30,7 @@
30
30
  - [Flatpak](#flatpak)
31
31
  - [Installation](#installation)
32
32
  - [Prerequisites](#prerequisites)
33
+ - [The Easy and Fast way to always run the latest version](#the-easy-and-fast-way-to-always-run-the-latest-version)
33
34
  - [Common Installation Recipes for Ubuntu and Fedora](#common-installation-recipes-for-ubuntu-and-fedora)
34
35
  - [Ubuntu 22.04 LTS](#ubuntu-2204-lts)
35
36
  - [Ubuntu 23.04](#ubuntu-2304)
@@ -224,6 +225,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
224
225
 
225
226
  ## Recent Changes
226
227
 
228
+ -[25-5-21] Fix crash from unsafe dict key access when processing F1-F12.
227
229
  - [25-5-6] Merged PR from @JG3LLB, Koji-Kawano, Adding code to stop sending morse if using rigctld to send, and @alduhoo adding more control to CW serial number padding.
228
230
 
229
231
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -248,6 +250,40 @@ Not1MM requires:
248
250
 
249
251
  You should install these through your distribution's package manager before continuing.
250
252
 
253
+ ### The Easy and Fast way to always run the latest version
254
+
255
+ - Step 1. Visit [Astral](https://docs.astral.sh/uv/) and install uv.
256
+
257
+ In short you run this in your terminal:
258
+
259
+ ```bash
260
+ curl -LsSf https://astral.sh/uv/install.sh | sh
261
+ ```
262
+
263
+ - Step 2. Tell it to run not1mm:
264
+
265
+ ```bash
266
+ uv tool run not1mm
267
+ ```
268
+
269
+ That's it... It will go out, fetch the latest version of not1mm, setup a python virtual environment, get all the needed python libraries, cache everything and run not1mm. The first time takes a minute, but each time after, it's lightning quick and it will automatically check for updates and run the latest version.
270
+
271
+ But wait... There's more. If your distro is old and you're stuck with an older version of python... Say 3.10. And you want to see what all the cool kids are using. But you don't want to corrupt your broke ol' system by downloading the newest Python version. No problem. You can tell uv to run not1mm with any version of Python you'd like. Let's say 3.14.
272
+
273
+ ```bash
274
+ uv tool run --python 3.14 not1mm
275
+ ```
276
+
277
+ It'll download Python 3.14 into you virtual environment and run not1mm.
278
+
279
+ Let's say I was an idiot and pushed a new version and did't fully test it. This happens a-lot... We test in production. Or lets say you just want to see the pain that was back in 2023. No problem.
280
+
281
+ ```bash
282
+ uv tool run --python 3.10 not1mm==23.5.19
283
+ ```
284
+
285
+ Pow! Enjoy the pain... If uv is not your cuppa, you can follow the more traditional route below.
286
+
251
287
  ### Common Installation Recipes for Ubuntu and Fedora
252
288
 
253
289
  I've taken the time to install some common Linux distributions into a VM and
@@ -349,7 +385,7 @@ all the details from:
349
385
  In short, You should install stuff into a Python virtual environment. Newer
350
386
  Linux distros will make you do this unless you include a command line argument
351
387
  akin to '--break-my-system' when using pip. I'm not telling you to use pipx.
352
- But... **Use pipx**.
388
+ But... **Use pipx**. Or better visit the [section above](#the-easy-and-fast-way-to-always-run-the-latest-version) on using uv.
353
389
 
354
390
  #### Bootstrapping pipx
355
391
 
@@ -30,7 +30,7 @@ import notctyparser
30
30
 
31
31
  from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
32
32
  from PyQt6.QtCore import QDir, Qt, QThread, QSettings, QCoreApplication
33
- from PyQt6.QtGui import QFontDatabase, QColorConstants, QPalette, QColor, QPixmap
33
+ from PyQt6.QtGui import QFontDatabase, QColorConstants, QPalette, QColor, QPixmap, QFont
34
34
  from PyQt6.QtWidgets import QFileDialog, QSplashScreen, QApplication
35
35
  from PyQt6.QtCore import QT_VERSION_STR, PYQT_VERSION_STR
36
36
 
@@ -212,7 +212,45 @@ class MainWindow(QtWidgets.QMainWindow):
212
212
  )
213
213
  self.setCorner(Qt.Corner.TopLeftCorner, Qt.DockWidgetArea.LeftDockWidgetArea)
214
214
  self.setCorner(Qt.Corner.BottomLeftCorner, Qt.DockWidgetArea.LeftDockWidgetArea)
215
+ self.fontfamily = self.load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
215
216
  uic.loadUi(fsutils.APP_DATA_PATH / "main.ui", self)
217
+ if sys.platform == "darwin":
218
+ def_font_size = 12
219
+
220
+ QApplication.instance().setFont(QFont(self.fontfamily, def_font_size))
221
+ self.F1.setFont(QFont(self.fontfamily, def_font_size))
222
+ self.F2.setFont(QFont(self.fontfamily, def_font_size))
223
+ self.F3.setFont(QFont(self.fontfamily, def_font_size))
224
+ self.F4.setFont(QFont(self.fontfamily, def_font_size))
225
+ self.F5.setFont(QFont(self.fontfamily, def_font_size))
226
+ self.F6.setFont(QFont(self.fontfamily, def_font_size))
227
+ self.F7.setFont(QFont(self.fontfamily, def_font_size))
228
+ self.F8.setFont(QFont(self.fontfamily, def_font_size))
229
+ self.F9.setFont(QFont(self.fontfamily, def_font_size))
230
+ self.F10.setFont(QFont(self.fontfamily, def_font_size))
231
+ self.F11.setFont(QFont(self.fontfamily, def_font_size))
232
+ self.F12.setFont(QFont(self.fontfamily, def_font_size))
233
+ self.radioButton_run.setFont(QFont(self.fontfamily, def_font_size))
234
+ self.radioButton_sp.setFont(QFont(self.fontfamily, def_font_size))
235
+ self.cw_speed.setFont(QFont(self.fontfamily, def_font_size))
236
+ self.callsign_label.setFont(QFont(self.fontfamily, def_font_size))
237
+ self.snt_label.setFont(QFont(self.fontfamily, def_font_size))
238
+ self.rcv_label.setFont(QFont(self.fontfamily, def_font_size))
239
+ self.other_label.setFont(QFont(self.fontfamily, def_font_size))
240
+ self.exch_label.setFont(QFont(self.fontfamily, def_font_size))
241
+ self.heading_distance.setFont(QFont(self.fontfamily, def_font_size))
242
+ self.history_info.setFont(QFont(self.fontfamily, def_font_size))
243
+ self.dx_entity.setFont(QFont(self.fontfamily, def_font_size))
244
+ self.score.setFont(QFont(self.fontfamily, def_font_size))
245
+ self.mults.setFont(QFont(self.fontfamily, def_font_size))
246
+
247
+ self.callsign.setFont(QFont(self.fontfamily, 20))
248
+ self.sent.setFont(QFont(self.fontfamily, 20))
249
+ self.receive.setFont(QFont(self.fontfamily, 20))
250
+ self.other_1.setFont(QFont(self.fontfamily, 20))
251
+ self.other_2.setFont(QFont(self.fontfamily, 20))
252
+ self.dupe_indicator.setFont(QFont(self.fontfamily, 20))
253
+
216
254
  self.history_info.hide()
217
255
  QApplication.instance().focusObjectChanged.connect(self.on_focus_changed)
218
256
  QApplication.instance().styleHints().colorSchemeChanged.connect(
@@ -1990,11 +2028,11 @@ class MainWindow(QtWidgets.QMainWindow):
1990
2028
  indicator.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
1991
2029
  if self.text_color == QColorConstants.Black:
1992
2030
  indicator.setStyleSheet(
1993
- "font-family: JetBrains Mono ExtraLight; color: black;"
2031
+ f"font-family: {self.fontfamily}; color: black;"
1994
2032
  )
1995
2033
  else:
1996
2034
  indicator.setStyleSheet(
1997
- "font-family: JetBrains Mono ExtraLight; color: white"
2035
+ f"font-family: {self.fontfamily}; color: white;"
1998
2036
  )
1999
2037
 
2000
2038
  def set_band_indicator(self, band: str) -> None:
@@ -2017,7 +2055,7 @@ class MainWindow(QtWidgets.QMainWindow):
2017
2055
  if indicator:
2018
2056
  indicator.setFrameShape(QtWidgets.QFrame.Shape.Box)
2019
2057
  indicator.setStyleSheet(
2020
- "font-family: JetBrains Mono ExtraLight; color: green;"
2058
+ f"font-family: {self.fontfamily}; color: green;"
2021
2059
  )
2022
2060
 
2023
2061
  def closeEvent(self, _event) -> None:
@@ -2872,7 +2910,13 @@ class MainWindow(QtWidgets.QMainWindow):
2872
2910
  next_serial = "1"
2873
2911
  macro = macro.upper()
2874
2912
  if self.radio_state.get("mode") == "CW":
2875
- macro = macro.replace("#", next_serial.rjust(self.pref["cwpaddinglength"], self.pref["cwpaddingchar"]))
2913
+ macro = macro.replace(
2914
+ "#",
2915
+ next_serial.rjust(
2916
+ self.pref.get("cwpaddinglength", 3),
2917
+ self.pref.get("cwpaddingchar", "T"),
2918
+ ),
2919
+ )
2876
2920
  else:
2877
2921
  macro = macro.replace("#", next_serial)
2878
2922
  macro = macro.replace("{MYCALL}", self.station.get("Call", ""))
@@ -2885,7 +2929,13 @@ class MainWindow(QtWidgets.QMainWindow):
2885
2929
  macro = macro.replace("{SNT}", self.sent.text())
2886
2930
  if self.radio_state.get("mode") == "CW":
2887
2931
  macro = macro.replace(
2888
- "{SENTNR}", self.other_1.text().lstrip("0").rjust(self.pref["cwpaddinglength"], self.pref["cwpaddingchar"])
2932
+ "{SENTNR}",
2933
+ self.other_1.text()
2934
+ .lstrip("0")
2935
+ .rjust(
2936
+ self.pref.get("cwpaddinglength", 3),
2937
+ self.pref.get("cwpaddingchar", "T"),
2938
+ ),
2889
2939
  )
2890
2940
  else:
2891
2941
  macro = macro.replace("{SENTNR}", self.other_1.text())
@@ -4177,26 +4227,26 @@ class MainWindow(QtWidgets.QMainWindow):
4177
4227
  logger.debug("******Cabrillo*****")
4178
4228
  self.contest.cabrillo(self, file_encoding)
4179
4229
 
4230
+ def load_fonts_from_dir(self, directory: str) -> str:
4231
+ """
4232
+ Well it loads fonts from a directory...
4180
4233
 
4181
- def load_fonts_from_dir(directory: str) -> set:
4182
- """
4183
- Well it loads fonts from a directory...
4184
-
4185
- Parameters
4186
- ----------
4187
- directory : str
4188
- The directory to load fonts from.
4234
+ Parameters
4235
+ ----------
4236
+ directory : str
4237
+ The directory to load fonts from.
4189
4238
 
4190
- Returns
4191
- -------
4192
- set
4193
- A set of font families installed in the directory.
4194
- """
4195
- font_families = set()
4196
- for _fi in QDir(directory).entryInfoList(["*.ttf", "*.woff", "*.woff2"]):
4197
- _id = QFontDatabase.addApplicationFont(_fi.absoluteFilePath())
4198
- font_families |= set(QFontDatabase.applicationFontFamilies(_id))
4199
- return font_families
4239
+ Returns
4240
+ -------
4241
+ set
4242
+ A set of font families installed in the directory.
4243
+ """
4244
+ font_families = set()
4245
+ for _fi in QDir(directory).entryInfoList(["*.ttf", "*.woff", "*.woff2"]):
4246
+ _id = QFontDatabase.addApplicationFont(_fi.absoluteFilePath())
4247
+ font_families |= set(QFontDatabase.applicationFontFamilies(_id))
4248
+ result = set((max(font_families, key=len),))
4249
+ return list(result)[0]
4200
4250
 
4201
4251
 
4202
4252
  def install_icons() -> None:
@@ -4252,8 +4302,8 @@ def run() -> None:
4252
4302
  )
4253
4303
  QCoreApplication.processEvents()
4254
4304
 
4255
- families = load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
4256
- logger.info(f"font families {families}")
4305
+ # families = load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
4306
+ # logger.info(f"font families {families}")
4257
4307
  window = MainWindow(splash)
4258
4308
  window.callsign.setFocus()
4259
4309
  splash.finish(window)
@@ -19,7 +19,7 @@ from decimal import Decimal
19
19
  from json import loads
20
20
 
21
21
  from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
22
- from PyQt6.QtGui import QColorConstants, QPalette, QColor
22
+ from PyQt6.QtGui import QColorConstants, QPalette, QColor, QFont
23
23
  from PyQt6.QtWidgets import QDockWidget
24
24
  from PyQt6.QtCore import Qt, pyqtSignal
25
25
 
@@ -343,6 +343,8 @@ class BandMapWindow(QDockWidget):
343
343
  self._udpwatch = None
344
344
 
345
345
  uic.loadUi(fsutils.APP_DATA_PATH / "bandmap.ui", self)
346
+ self.thefont = QFont()
347
+ self.thefont.setFamily("JetBrains Mono")
346
348
  self.settings = self.get_settings()
347
349
  self.clear_spot_olderSpinBox.setValue(
348
350
  int(self.settings.get("cluster_expire", 1))
@@ -581,6 +583,7 @@ class BandMapWindow(QDockWidget):
581
583
  freq = self.currentBand.start + step * i
582
584
  text = f"{freq:.3f}"
583
585
  self.something = self.bandmap_scene.addText(text)
586
+ self.something.setFont(self.thefont)
584
587
  self.something.setDefaultTextColor(self.text_color)
585
588
  self.something.setPos(
586
589
  -(self.something.boundingRect().width()) + 10,
@@ -726,6 +729,7 @@ class BandMapWindow(QDockWidget):
726
729
  + " "
727
730
  + items.get("ts").split()[1][:-3]
728
731
  )
732
+ text.setFont(self.thefont)
729
733
  text.document().setDocumentMargin(0)
730
734
  text.setPos(60, text_y - (text.boundingRect().height() / 2))
731
735
  text.setFlags(
@@ -18,7 +18,7 @@
18
18
  <widget class="QLabel" name="label">
19
19
  <property name="font">
20
20
  <font>
21
- <family>JetBrains Mono ExtraLight</family>
21
+ <family>JetBrains Mono</family>
22
22
  <pointsize>30</pointsize>
23
23
  </font>
24
24
  </property>
@@ -12,7 +12,7 @@
12
12
  </property>
13
13
  <property name="font">
14
14
  <font>
15
- <family>JetBrains Mono ExtraLight</family>
15
+ <family>JetBrains Mono</family>
16
16
  </font>
17
17
  </property>
18
18
  <property name="windowTitle">
@@ -85,7 +85,7 @@
85
85
  <widget class="QScrollArea" name="scrollArea">
86
86
  <property name="font">
87
87
  <font>
88
- <family>JetBrains Mono ExtraLight</family>
88
+ <family>JetBrains Mono</family>
89
89
  <pointsize>9</pointsize>
90
90
  </font>
91
91
  </property>
@@ -106,7 +106,7 @@
106
106
  </property>
107
107
  <property name="font">
108
108
  <font>
109
- <family>JetBrains Mono ExtraLight</family>
109
+ <family>JetBrains Mono</family>
110
110
  <pointsize>9</pointsize>
111
111
  </font>
112
112
  </property>
@@ -115,7 +115,7 @@
115
115
  <widget class="QGraphicsView" name="graphicsView">
116
116
  <property name="font">
117
117
  <font>
118
- <family>JetBrains Mono ExtraLight</family>
118
+ <family>JetBrains Mono</family>
119
119
  <pointsize>6</pointsize>
120
120
  </font>
121
121
  </property>
@@ -12,7 +12,7 @@
12
12
  </property>
13
13
  <property name="font">
14
14
  <font>
15
- <family>JetBrains Mono ExtraLight</family>
15
+ <family>JetBrains Mono</family>
16
16
  </font>
17
17
  </property>
18
18
  <property name="focusPolicy">
@@ -33,7 +33,7 @@
33
33
  </property>
34
34
  <property name="font">
35
35
  <font>
36
- <family>JetBrains Mono ExtraLight</family>
36
+ <family>JetBrains Mono</family>
37
37
  <pointsize>12</pointsize>
38
38
  </font>
39
39
  </property>
@@ -70,7 +70,7 @@
70
70
  </property>
71
71
  <property name="font">
72
72
  <font>
73
- <family>JetBrains Mono ExtraLight</family>
73
+ <family>JetBrains Mono</family>
74
74
  <pointsize>12</pointsize>
75
75
  </font>
76
76
  </property>
@@ -107,7 +107,7 @@
107
107
  </property>
108
108
  <property name="font">
109
109
  <font>
110
- <family>JetBrains Mono ExtraLight</family>
110
+ <family>JetBrains Mono</family>
111
111
  <pointsize>12</pointsize>
112
112
  </font>
113
113
  </property>
@@ -141,7 +141,7 @@
141
141
  <widget class="QLabel" name="logListLabel">
142
142
  <property name="font">
143
143
  <font>
144
- <family>JetBrains Mono ExtraLight</family>
144
+ <family>JetBrains Mono</family>
145
145
  <pointsize>10</pointsize>
146
146
  </font>
147
147
  </property>
@@ -154,7 +154,7 @@
154
154
  <widget class="QLabel" name="masterListLabel">
155
155
  <property name="font">
156
156
  <font>
157
- <family>JetBrains Mono ExtraLight</family>
157
+ <family>JetBrains Mono</family>
158
158
  <pointsize>10</pointsize>
159
159
  </font>
160
160
  </property>
@@ -167,7 +167,7 @@
167
167
  <widget class="QLabel" name="telnetListLabel">
168
168
  <property name="font">
169
169
  <font>
170
- <family>JetBrains Mono ExtraLight</family>
170
+ <family>JetBrains Mono</family>
171
171
  <pointsize>10</pointsize>
172
172
  </font>
173
173
  </property>