Skip to content

Commit 1d622e4

Browse files
committed
add info to pin popup
1 parent a0b5185 commit 1d622e4

File tree

1 file changed

+67
-26
lines changed

1 file changed

+67
-26
lines changed

Source/GUI/Qt.py

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import re
1414
import base64
1515
from queue import Queue
16+
import html
1617

1718
# Placeholder for APRS functionality
1819
from aprspy import APRS
@@ -682,6 +683,14 @@ def decode_aprs(self, line):
682683

683684
return None
684685

686+
def handle_js_result(self, result):
687+
if result is None:
688+
print("[JS Error] JavaScript execution failed or returned None.")
689+
elif isinstance(result, str) and result.strip() == "":
690+
print("[JS Error] JavaScript returned an empty string.")
691+
#else:
692+
#print("[JS Result]:", result)
693+
685694
def handle_serial_data(self, line):
686695
timestamp = datetime.now().strftime("[%H:%M:%S]")
687696

@@ -730,8 +739,9 @@ def handle_serial_data(self, line):
730739
lat = getattr(packet, "latitude", None)
731740
lon = getattr(packet, "longitude", None)
732741
src = getattr(packet, "source", "")
742+
info = getattr(packet, "info", "")
733743

734-
symbol_description = symbol_map.get(f'{packet.symbol_table}{packet.symbol_id}', 'Unknown')
744+
#symbol_description = symbol_map.get(f'{packet.symbol_table}{packet.symbol_id}', 'Unknown')
735745
symbol_code = f"{packet.symbol_table}{packet.symbol_id}"
736746
emoji = emoji_map.get(symbol_code, "📍") # default pin if unknown
737747

@@ -742,45 +752,76 @@ def handle_serial_data(self, line):
742752
# Remove existing marker if present
743753
if key in self.marker_registry:
744754
prev_marker = self.marker_registry[key]
745-
js_remove = f"map.removeLayer({prev_marker});"
746-
self.map_view.page().runJavaScript(js_remove)
755+
js_remove = f"""
756+
try {{
757+
map.removeLayer({prev_marker});
758+
'success';
759+
}} catch (err) {{
760+
console.error('[Remove Marker Error]', err);
761+
'[Remove Marker Error] ' + err.toString();
762+
}}
763+
"""
764+
self.map_view.page().runJavaScript(js_remove, self.handle_js_result)
765+
747766

748767
# Add new marker with emoji (without recentering the map)
749-
popup_text = f"{emoji} {src}"
768+
#popup_text = f"{emoji} {src}"
769+
#info.replace("`", "\\`").replace("$", "\\$")
770+
info.replace("\\", "\\\\").replace("'", "\\'").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "")
771+
popup_text = f"{emoji} {src}<br>{info}"
772+
#popup_text = f"{emoji} {src}" + (f"<br>{html.escape(info)}" if info else "")
750773
js_add = f"""
751-
var zoom = map.getZoom();
752-
var scale = 1 + (zoom - 10) * 0.25;
753-
var {marker_id} = L.marker([{lat}, {lon}], {{
754-
icon: L.divIcon({{
755-
className: 'emoji-icon',
756-
html: '{emoji}',
757-
iconSize: null
758-
}})
759-
}}).addTo(map).bindPopup('{popup_text}');
760-
document.querySelectorAll('.emoji-icon').forEach(function(el) {{ el.style.fontSize = (24 * scale) + 'px'; }});
774+
try {{
775+
var zoom = map.getZoom();
776+
var scale = 1 + (zoom - 10) * 0.25;
777+
var {marker_id} = L.marker([{lat}, {lon}], {{
778+
icon: L.divIcon({{
779+
className: 'emoji-icon',
780+
html: '{emoji}',
781+
iconSize: null
782+
}})
783+
}}).addTo(map).bindPopup(`{popup_text}`);
784+
document.querySelectorAll('.emoji-icon').forEach(function(el) {{
785+
el.style.fontSize = (24 * scale) + 'px';
786+
}});
787+
'success'
788+
}} catch (err) {{
789+
'JS Error: ' + err.message
790+
}}
761791
"""
762-
self.map_view.page().runJavaScript(js_add)
792+
#self.map_view.page().runJavaScript(js_add)
793+
self.map_view.page().runJavaScript(js_add, self.handle_js_result)
794+
763795

764796
# Add zoom scaling logic
765797
js_scale = """
766-
map.off('zoomend');
767-
map.on('zoomend', function() {
768-
var zoom = map.getZoom();
769-
var scale = 1 + (zoom - 10) * 0.25;
770-
var icons = document.getElementsByClassName('emoji-icon');
771-
for (var i = 0; i < icons.length; i++) {
772-
icons[i].style.fontSize = (24 * scale) + 'px';
773-
}
774-
});
798+
try {
799+
map.off('zoomend');
800+
map.on('zoomend', function() {
801+
var zoom = map.getZoom();
802+
var scale = 1 + (zoom - 10) * 0.25;
803+
var icons = document.getElementsByClassName('emoji-icon');
804+
for (var i = 0; i < icons.length; i++) {
805+
icons[i].style.fontSize = (24 * scale) + 'px';
806+
}
807+
});
808+
'success';
809+
} catch (err) {
810+
console.error('[Zoom Scale Error]', err);
811+
'[Zoom Scale Error] ' + err.toString();
812+
}
775813
"""
776-
self.map_view.page().runJavaScript(js_scale)
777814

778-
# Optionally open popup (this doesn't pan the map)
815+
#self.map_view.page().runJavaScript(js_scale)
816+
self.map_view.page().runJavaScript(js_scale, self.handle_js_result)
817+
818+
# Optionally open popup
779819
#js_popup = f"{marker_id}.openPopup();"
780820
#self.map_view.page().runJavaScript(js_popup)
781821

782822
# Store reference
783823
self.marker_registry[key] = marker_id
824+
784825
except Exception as e:
785826
#self.msg_output.appendPlainText(f"{timestamp} Failed to parse APRS: {e}")
786827
pass

0 commit comments

Comments
 (0)