diff --git a/app/tools/satellites.py b/app/tools/satellites.py index b2afab8c..5ccceb30 100644 --- a/app/tools/satellites.py +++ b/app/tools/satellites.py @@ -14,7 +14,7 @@ class SatellitesParser(HTMLParser): _HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/59.02"} - def __init__(self, url, entities=False, separator=' '): + def __init__(self, url="https://www.flysat.com/satlist.php", entities=False, separator=' '): HTMLParser.__init__(self) @@ -59,29 +59,23 @@ class SatellitesParser(HTMLParser): def error(self, message): pass - @run_task - def get_satellites(self, callback): + def get_satellites_list(self): self.reset() request = requests.get(url=self._url, headers=self._HEADERS) reason = request.reason - satellites = [] if reason == "OK": self.feed(request.text) if self._rows: - for sat in list(filter(lambda x: all(x) and len(x) == 5, self._rows)): - if callback(self.get_satellite(sat)): - break + return list(filter(lambda x: all(x) and len(x) == 5, self._rows)) else: print(reason) - return satellites - def get_satellite(self, sat): - pos = "".join(c for c in sat[2] if c.isdigit() or c.isalpha() or c == ".") - return Satellite(name=sat[1] + " ({})".format(pos), + pos = "".join(c for c in sat[1] if c.isdigit() or c.isalpha() or c == ".") + return Satellite(name=sat[0] + " ({})".format(pos), flags="0", position=self.get_position(pos.replace(".", "")), - transponders=self.get_transponders(sat[0])) + transponders=self.get_transponders(sat[3])) def get_position(self, pos): return "{}{}".format("-" if pos[-1] == "W" else "", pos[:-1]) diff --git a/app/ui/satellites_dialog.glade b/app/ui/satellites_dialog.glade index 8439c345..a7341bdb 100644 --- a/app/ui/satellites_dialog.glade +++ b/app/ui/satellites_dialog.glade @@ -459,6 +459,7 @@ Receive from internet True gtk-refresh + False @@ -1412,14 +1413,42 @@ button2 - + + + + + + + + + + + + + + + + + + + + + + FlySat + + + False Satellites update + True + True dialog + True 480 + 320 False vertical 2 @@ -1560,11 +1589,62 @@ Satellite + True + + + + 0 + + Position + True + + + + 1 + + + + + + + Type + True + + + + 2 + + + + + + + False + Url + + + + 3 + + + + + + + Selected + + + + + + 4 + + @@ -1593,14 +1673,14 @@ True False - + True False True - Recieve + Update True - gtk-goto-bottom - + gtk-refresh + True @@ -1622,6 +1702,21 @@ True + + + True + False + False + Receive + True + gtk-goto-bottom + + + + True + True + + @@ -1638,6 +1733,7 @@ True + 100 True True False @@ -1732,16 +1828,8 @@ - - - - - - - - - FlySat - - + + sat_update_close_button + diff --git a/app/ui/satellites_dialog.py b/app/ui/satellites_dialog.py index 9af269e4..ff61bd88 100644 --- a/app/ui/satellites_dialog.py +++ b/app/ui/satellites_dialog.py @@ -1,7 +1,7 @@ import re from math import fabs -from app.commons import run_idle +from app.commons import run_idle, run_task from app.eparser import get_satellites, write_satellites, Satellite, Transponder from app.tools.satellites import SatellitesParser from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, MOVE_KEYS @@ -19,14 +19,11 @@ class SatellitesDialog: def __init__(self, transient, options): self._data_path = options.get("data_dir_path") + "satellites.xml" self._options = options - self._download_task = False handlers = {"on_open": self.on_open, "on_remove": self.on_remove, "on_save": self.on_save, "on_update": self.on_update, - "on_receive": self.on_receive, - "on_cancel_receive": self.on_cancel_receive, "on_up": self.on_up, "on_down": self.on_down, "on_popup_menu": self.on_popup_menu, @@ -67,7 +64,6 @@ class SatellitesDialog: @run_idle def show(self): self._dialog.run() - self.on_cancel_receive() self._dialog.destroy() def on_resize(self, window): @@ -76,7 +72,6 @@ class SatellitesDialog: self._options["sat_editor_window_size"] = window.get_size() def on_quit(self, item): - self.on_cancel_receive() self._dialog.destroy() def on_open(self, model): @@ -285,32 +280,10 @@ class SatellitesDialog: model.foreach(self.parse_data, satellites) write_satellites(satellites, self._data_path) - def on_update(self, button: Gtk.ToggleToolButton): - self._download_bar.set_visible(button.get_active()) - - @run_idle - def on_receive(self, item): - if self._download_task: - show_dialog(DialogType.ERROR, self._dialog, "The task is already running!") - return - - model = self._sat_view.get_model() - model.clear() - self._download_task = True - - def callback(sat): - if self._download_task: - self.append_satellite(model, sat) - return False - else: - print("Canceled!") - return True - - SatellitesParser(url="https://www.flysat.com/satlist.php").get_satellites(callback) - - @run_idle - def on_cancel_receive(self, item=None): - self._download_task = False + def on_update(self, item): + dialog = SatellitesUpdateDialog(self._dialog, self._sat_view.get_model()) + sats = dialog.run() + dialog.destroy() @staticmethod def parse_data(model, path, itr, sats): @@ -334,6 +307,8 @@ class SatellitesDialog: menu.popup(None, None, None, None, event.button, event.time) +# ***************** Transponder dialog *******************# + class TransponderDialog: """ Shows dialog for adding or edit transponder """ @@ -344,9 +319,7 @@ class TransponderDialog: builder = Gtk.Builder() builder.set_translation_domain(TEXT_DOMAIN) builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade", - ("transponder_dialog", - "pol_store", "fec_store", - "mod_store", "system_store", + ("transponder_dialog", "pol_store", "fec_store", "mod_store", "system_store", "pls_mode_store")) builder.connect_signals(handlers) @@ -421,6 +394,8 @@ class TransponderDialog: return True +# ***************** Satellite dialog *******************# + class SatelliteDialog: """ Shows dialog for adding or edit satellite """ @@ -462,5 +437,98 @@ class SatelliteDialog: return Satellite(name=name, flags="0", position=pos, transponders=None) +# ***************** Satellite update dialog *******************# + +class SatellitesUpdateDialog: + def __init__(self, transient, main_model): + handlers = {"on_update_satellites_list": self.on_update_satellites_list, + "on_receive_satellites_list": self.on_receive_satellites_list, + "on_cancel_receive": self.on_cancel_receive, + "on_selected_toggled": self.on_selected_toggled, + "on_quit": self.on_quit} + builder = Gtk.Builder() + builder.set_translation_domain(TEXT_DOMAIN) + builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade", + ("satellites_update_dialog", "update_source_store", "update_sat_list_store")) + builder.connect_signals(handlers) + + self._dialog = builder.get_object("satellites_update_dialog") + self._dialog.set_transient_for(transient) + self._main_model = main_model + # self._dialog.get_content_area().set_border_width(0) + self._sat_view = builder.get_object("sat_update_tree_view") + self._receive_sat_list_tool_button = builder.get_object("receive_sat_list_tool_button") + self._download_task = False + self._parser = None + + def run(self): + if self._dialog.run() == Gtk.ResponseType.CANCEL: + self._download_task = False + return + + def destroy(self): + self._dialog.destroy() + + @run_idle + def on_update_satellites_list(self, item): + if self._download_task: + show_dialog(DialogType.ERROR, self._dialog, "The task is already running!") + return + + model = self._sat_view.get_model() + model.clear() + self._download_task = True + if not self._parser: + self._parser = SatellitesParser(url="https://www.flysat.com/satlist.php") + sats = self._parser.get_satellites_list() + if sats: + for sat in sats: + model = self._sat_view.get_model() + model.append((sat[1], sat[2], sat[3], sat[0], False)) + self._download_task = False + + @run_idle + def on_receive_satellites_list(self, item): + if self._download_task: + show_dialog(DialogType.ERROR, self._dialog, "The task is already running!") + return + self.receive_satellites() + + @run_task + def receive_satellites(self): + self._download_task = True + model = self._sat_view.get_model() + sats = [] + for sat in [r for r in model if r[4]]: + if not self._download_task: + return + print("Process:", sat[0]) + sats.append(self._parser.get_satellite(sat[:-1])) + + sats = {s[2]: s for s in sats} # key = position, v = satellite + for row in self._main_model: + pos = row[-1] + if pos in sats: + sat = sats.pop(pos) + print("The remaining satellites:", sats) + self._download_task = False + + @run_idle + def on_cancel_receive(self, item=None): + self._download_task = False + + def on_selected_toggled(self, toggle, path): + model = self._sat_view.get_model() + model.set_value(model.get_iter(path), 4, not toggle.get_active()) + self.update_receive_button_state(model) + + @run_idle + def update_receive_button_state(self, model): + self._receive_sat_list_tool_button.set_sensitive((any(r[4] for r in model))) + + def on_quit(self): + self._download_task = False + + if __name__ == "__main__": pass