def import_from_string(self): # Load the encoded string from the clipboard encoded = pyperclip.paste() try: decoded = base64.b64decode(encoded.encode('utf-8')) e = json.loads(decoded) self.logger.debug(e) self.profile = Profile.to_object(e) self.logger.debug(self.profile.to_dict()) self.update_waypoints_list(set_to_first=True) PyGUI.Popup( 'Loaded waypoint data from encoded string successfully') except Exception as e: self.logger.error(e, exc_info=True) PyGUI.Popup('Failed to parse profile from string')
def run(self): while True: event, self.values = self.window.Read() # self.logger.debug(f"Event: {event}") # self.logger.debug(f"Values: {self.values}") if event is None or event == 'Exit': self.logger.info("Exiting...") break elif event == "Add": position, elevation, name = self.validate_coords() if position is not None: self.add_waypoint(position, elevation, name) elif event == "Encode to String": self.export_to_string() elif event == "Decode from String": self.import_from_string() elif event == "Update": if self.values['activesList']: waypoint = self.find_selected_waypoint() position, elevation, name = self.validate_coords() if position is not None: waypoint.position = position waypoint.elevation = elevation waypoint.name = name self.update_waypoints_list() elif event == "Remove": if self.values['activesList']: self.remove_selected_waypoint() self.update_waypoints_list() elif event == "activesList": if self.values['activesList']: waypoint = self.find_selected_waypoint() self.update_position(waypoint.position, waypoint.elevation, waypoint.name, waypoint_type=waypoint.wp_type) elif event == "Save profile": if self.profile.waypoints: name = self.profile.profilename if not name: name = PyGUI.PopupGetText("Enter profile name", "Saving profile") if not name: continue self.profile.save(name) self.update_profiles_list(name) elif event == "Delete profile": if not self.profile.profilename: continue Profile.delete(self.profile.profilename) profiles = self.get_profile_names() self.window.Element("profileSelector").Update(values=[""] + profiles) self.profile = Profile('') self.update_waypoints_list() self.update_position() elif event == "profileSelector": try: profile_name = self.values['profileSelector'] if profile_name != '': self.profile = Profile.load(profile_name) else: self.profile = Profile('') self.editor.set_driver(self.profile.aircraft) self.update_waypoints_list() except DoesNotExist: PyGUI.Popup("Profile not found") elif event == "Export to file": e = self.profile.to_dict() filename = PyGUI.PopupGetFile("Enter file name", "Exporting profile", default_extension=".json", save_as=True, file_types=(("JSON File", "*.json"), )) if filename is None: continue with open(filename + ".json", "w+") as f: json.dump(e, f, indent=4) elif event == "Import from file": filename = PyGUI.PopupGetFile("Enter file name", "Importing profile") if filename is None: continue with open(filename, "r") as f: d = json.load(f) self.profile = Profile.to_object(d) self.update_waypoints_list() if self.profile.profilename: self.update_profiles_list(self.profile.profilename) elif event == "capture": if not self.capturing: self.start_quick_capture() else: self.stop_quick_capture() elif event == "quick_capture": self.exit_quick_capture = False self.disable_coords_input() self.window.Element('capture').Update(text="Stop capturing") self.window.Element('quick_capture').Update(disabled=True) self.window.Element('capture_status').Update( "Status: Capturing...") self.capturing = True self.window.Refresh() keyboard.add_hotkey(self.capture_key, self.add_wp_parsed_coords, timeout=1) elif event == "baseSelector": base = self.editor.default_bases.get( self.values['baseSelector']) if base is not None: self.update_position(base.position, base.elevation, base.name) elif event == "enter": self.enter_coords_to_aircraft() elif event in ("MSN", "WP", "HA", "FP", "ST", "DP", "IP", "HB"): self.select_wp_type(event) elif event == "elevFeet": self.update_altitude_elements("meters") elif event == "elevMeters": self.update_altitude_elements("feet") elif event in ("latDeg", "latMin", "latSec", "lonDeg", "lonMin", "lonSec"): position, _, _ = self.validate_coords() if position is not None: m = mgrs.encode( mgrs.LLtoUTM(position.lat.decimal_degree, position.lon.decimal_degree), 5) self.window.Element("mgrs").Update(m) elif event == "mgrs": mgrs_string = self.window.Element("mgrs").Get() if mgrs_string: try: decoded_mgrs = mgrs.UTMtoLL(mgrs.decode(mgrs_string)) position = LatLon( Latitude(degree=decoded_mgrs["lat"]), Longitude(degree=decoded_mgrs["lon"])) self.update_position(position, update_mgrs=False) except (TypeError, ValueError) as e: self.logger.error(f"Failed to decode MGRS: {e}") elif event in ("hornet", "tomcat", "harrier", "warthog", "mirage"): self.profile.aircraft = event self.editor.set_driver(event) self.update_waypoints_list() elif event == "filter": self.filter_preset_waypoints_dropdown() self.close()