From c2fd116252af188daf74135943231c00edfb2a98 Mon Sep 17 00:00:00 2001 From: DYefremov Date: Sat, 2 Jul 2022 18:40:26 +0300 Subject: [PATCH] xml data rendering refactoring --- app/eparser/satxml.py | 42 +++++----- app/ui/xml/dialogs.py | 18 ++--- app/ui/xml/edit.py | 165 +++++++++++++++++++++++++++++++++------- app/ui/xml/editor.glade | 60 ++++++++------- 4 files changed, 199 insertions(+), 86 deletions(-) diff --git a/app/eparser/satxml.py b/app/eparser/satxml.py index c5b7cc22..5bdfe207 100644 --- a/app/eparser/satxml.py +++ b/app/eparser/satxml.py @@ -33,9 +33,7 @@ from xml.dom.minidom import Document import xml.etree.ElementTree as ETree -from .ecommons import (POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value, - Terrestrial, Cable, TerTransponder, CableTransponder, T_SYSTEM, BANDWIDTH, GUARD_INTERVAL, - TRANSMISSION_MODE, T_FEC, HIERARCHY, C_MODULATION, FEC_DEFAULT, Inversion, CONSTELLATION) +from .ecommons import Satellite, Terrestrial, Cable, Transponder, TerTransponder, CableTransponder _SAT_COMMENT = (" File was created in DemonEditor\n\n" "usable flags are\n" @@ -71,10 +69,10 @@ def get_sat_transponders(elem): """ Returns satellite transponders list. """ return [Transponder(e.get("frequency", "0"), e.get("symbol_rate", "0"), - POLARIZATION[e.get("polarization", "0")], - FEC[e.get("fec_inner", "0")], - SYSTEM[e.get("system", "0")], - MODULATION[e.get("modulation", "0")], + e.get("polarization", None), + e.get("fec_inner", None), + e.get("system", None), + e.get("modulation", None), e.get("pls_mode", None), e.get("pls_code", None), e.get("is_id", None), @@ -93,15 +91,15 @@ def get_terrestrial(path): def get_ter_transponder(elem): """ Returns terrestrial transponder. """ return TerTransponder(elem.get("centre_frequency", "0"), - T_SYSTEM.get(elem.get("system", None), None), - BANDWIDTH.get(elem.get("bandwidth", None), None), - CONSTELLATION.get(elem.get("constellation", None), None), - T_FEC.get(elem.get("code_rate_hp", None), None), - T_FEC.get(elem.get("code_rate_lp", None), None), - GUARD_INTERVAL.get(elem.get("guard_interval", None), None), - TRANSMISSION_MODE.get(elem.get("transmission_mode", None), None), - HIERARCHY.get(elem.get("hierarchy_information", None), None), - Inversion(elem.get("inversion")).name if "inversion" in elem.keys() else None, + elem.get("system", None), + elem.get("bandwidth", None), + elem.get("constellation", None), + elem.get("code_rate_hp", None), + elem.get("code_rate_lp", None), + elem.get("guard_interval", None), + elem.get("transmission_mode", None), + elem.get("hierarchy_information", None), + elem.get("inversion", None), elem.get("plp_id", None)) @@ -118,8 +116,8 @@ def get_cable_transponders(elem): """ Returns cable transponders list. """ return [CableTransponder(e.get("frequency", "0"), e.get("symbol_rate", "0"), - FEC_DEFAULT[e.get("fec_inner", "0")], - C_MODULATION[e.get("modulation", "0")]) for e in elem.iter("transponder")] + e.get("fec_inner", None), + e.get("modulation", None)) for e in elem.iter("transponder")] def write_satellites(satellites, data_path): @@ -141,10 +139,10 @@ def write_satellites(satellites, data_path): transponder_child = doc.createElement("transponder") transponder_child.setAttribute("frequency", tr.frequency) transponder_child.setAttribute("symbol_rate", tr.symbol_rate) - transponder_child.setAttribute("polarization", get_key_by_value(POLARIZATION, tr.polarization)) - transponder_child.setAttribute("fec_inner", get_key_by_value(FEC, tr.fec_inner) or "0") - transponder_child.setAttribute("system", get_key_by_value(SYSTEM, tr.system) or "0") - transponder_child.setAttribute("modulation", get_key_by_value(MODULATION, tr.modulation) or "0") + transponder_child.setAttribute("polarization", tr.polarization) + transponder_child.setAttribute("fec_inner", tr.fec_inner or "0") + transponder_child.setAttribute("system", tr.system or "0") + transponder_child.setAttribute("modulation", tr.modulation or "0") if tr.pls_mode: transponder_child.setAttribute("pls_mode", tr.pls_mode) if tr.pls_code: diff --git a/app/ui/xml/dialogs.py b/app/ui/xml/dialogs.py index d352afad..e8bdef45 100644 --- a/app/ui/xml/dialogs.py +++ b/app/ui/xml/dialogs.py @@ -36,7 +36,7 @@ from gi.repository import GLib from app.commons import run_idle, run_task, log from app.eparser import Satellite, Transponder -from app.eparser.ecommons import PLS_MODE, get_key_by_value +from app.eparser.ecommons import PLS_MODE, get_key_by_value, POLARIZATION, FEC, SYSTEM, MODULATION from app.tools.satellites import SatellitesParser, SatelliteSource, ServicesParser from ..dialogs import show_dialog, DialogType, get_chooser_dialog, get_message, get_builder from ..main_helper import append_text_to_tview, get_base_model, on_popup_menu @@ -92,10 +92,10 @@ class TransponderDialog: def init_transponder(self, transponder): self._freq_entry.set_text(transponder.frequency) self._rate_entry.set_text(transponder.symbol_rate) - self._pol_box.set_active_id(transponder.polarization) - self._fec_box.set_active_id(transponder.fec_inner) - self._sys_box.set_active_id(transponder.system) - self._mod_box.set_active_id(transponder.modulation) + self._pol_box.set_active_id(POLARIZATION.get(transponder.polarization, None)) + self._fec_box.set_active_id(FEC.get(transponder.fec_inner, None)) + self._sys_box.set_active_id(SYSTEM.get(transponder.system, None)) + self._mod_box.set_active_id(MODULATION.get(transponder.modulation, None)) self._pls_mode_box.set_active_id(PLS_MODE.get(transponder.pls_mode, None)) self._is_id_entry.set_text(transponder.is_id if transponder.is_id else "") self._pls_code_entry.set_text(transponder.pls_code if transponder.pls_code else "") @@ -104,10 +104,10 @@ class TransponderDialog: def to_transponder(self): return Transponder(frequency=self._freq_entry.get_text(), symbol_rate=self._rate_entry.get_text(), - polarization=self._pol_box.get_active_id(), - fec_inner=self._fec_box.get_active_id(), - system=self._sys_box.get_active_id(), - modulation=self._mod_box.get_active_id(), + polarization=get_key_by_value(POLARIZATION, self._pol_box.get_active_id()), + fec_inner=get_key_by_value(FEC, self._fec_box.get_active_id()), + system=get_key_by_value(SYSTEM, self._sys_box.get_active_id()), + modulation=get_key_by_value(MODULATION, self._mod_box.get_active_id()), pls_mode=get_key_by_value(PLS_MODE, self._pls_mode_box.get_active_id()), pls_code=self._pls_code_entry.get_text(), is_id=self._is_id_entry.get_text(), diff --git a/app/ui/xml/edit.py b/app/ui/xml/edit.py index bd409b8e..b62c86c0 100644 --- a/app/ui/xml/edit.py +++ b/app/ui/xml/edit.py @@ -34,6 +34,8 @@ from gi.repository import GLib from app.commons import run_idle from app.connections import DownloadType from app.eparser import get_satellites, write_satellites, Satellite, Transponder +from app.eparser.ecommons import (POLARIZATION, FEC, SYSTEM, MODULATION, T_SYSTEM, BANDWIDTH, CONSTELLATION, T_FEC, + GUARD_INTERVAL, TRANSMISSION_MODE, HIERARCHY, Inversion, FEC_DEFAULT, C_MODULATION) from app.eparser.satxml import get_terrestrial, get_cable from .dialogs import SatelliteDialog, TransponderDialog, SatellitesUpdateDialog from ..dialogs import show_dialog, DialogType, get_chooser_dialog, get_message, get_builder @@ -43,7 +45,6 @@ from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, MOVE_KEYS, KeyboardKey, MOD class SatellitesTool(Gtk.Box): """ Class to processing *.xml data. """ - _aggr = [None for x in range(9)] # aggregate class DVB(str, Enum): SAT = "satellites" @@ -79,7 +80,7 @@ class SatellitesTool(Gtk.Box): "on_add": self.on_add, "on_transponder_add": self.on_transponder_add, "on_edit": self.on_edit, - "on_key_release": self.on_key_release, + "on_key_press": self.on_key_press, "on_visible_page": self.on_visible_page, "on_satellite_selection": self.on_satellite_selection, "on_terrestrial_selection": self.on_terrestrial_selection, @@ -97,28 +98,122 @@ class SatellitesTool(Gtk.Box): self._add_header_button = builder.get_object("add_header_button") self._update_header_button = builder.get_object("update_header_button") self.pack_start(builder.get_object("main_paned"), True, True, 0) - self._app.connect("profile-changed", lambda a, m: self.load_satellites_list()) - # Custom renderer - sat_pos_renderer = builder.get_object("sat_pos_renderer") - builder.get_object("sat_pos_column").set_cell_data_func(sat_pos_renderer, self.sat_pos_func) + self._app.connect("profile-changed", self.on_profile_changed) + # Custom renderers. + renderer = builder.get_object("sat_pos_renderer") + builder.get_object("sat_pos_column").set_cell_data_func(renderer, self.sat_pos_func) + # Satellite. + renderer = builder.get_object("sat_pol_renderer") + builder.get_object("pol_column").set_cell_data_func(renderer, self.sat_pol_func) + renderer = builder.get_object("sat_fec_renderer") + builder.get_object("fec_column").set_cell_data_func(renderer, self.sat_fec_func) + renderer = builder.get_object("sat_sys_renderer") + builder.get_object("sys_column").set_cell_data_func(renderer, self.sat_sys_func) + renderer = builder.get_object("sat_mod_renderer") + builder.get_object("mod_column").set_cell_data_func(renderer, self.sat_mod_func) + # Terrestrial. + renderer = builder.get_object("ter_system_renderer") + builder.get_object("ter_system_column").set_cell_data_func(renderer, self.ter_sys_func) + renderer = builder.get_object("ter_bandwidth_renderer") + builder.get_object("ter_bandwidth_column").set_cell_data_func(renderer, self.ter_bandwidth_func) + renderer = builder.get_object("ter_constellation_renderer") + builder.get_object("ter_constellation_column").set_cell_data_func(renderer, self.ter_constellation_func) + renderer = builder.get_object("ter_rate_hp_renderer") + builder.get_object("ter_rate_hp_column").set_cell_data_func(renderer, self.ter_fec_hp_func) + renderer = builder.get_object("ter_rate_lp_renderer") + builder.get_object("ter_rate_lp_column").set_cell_data_func(renderer, self.ter_fec_lp_func) + renderer = builder.get_object("ter_guard_renderer") + builder.get_object("ter_guard_column").set_cell_data_func(renderer, self.ter_guard_func) + renderer = builder.get_object("ter_tr_mode_renderer") + builder.get_object("ter_tr_mode_column").set_cell_data_func(renderer, self.ter_transmission_func) + renderer = builder.get_object("ter_hierarchy_renderer") + builder.get_object("ter_hierarchy_column").set_cell_data_func(renderer, self.ter_hierarchy_func) + renderer = builder.get_object("ter_inversion_renderer") + builder.get_object("ter_inversion_column").set_cell_data_func(renderer, self.ter_inversion_func) + # Cable. + renderer = builder.get_object("cable_fec_renderer") + builder.get_object("cable_fec_column").set_cell_data_func(renderer, self.cable_fec_func) + renderer = builder.get_object("cable_mod_renderer") + builder.get_object("cable_mod_column").set_cell_data_func(renderer, self.cable_mod_func) self.show() + # ******************** Custom renderers ******************** # + + def sat_pos_func(self, column, renderer, model, itr, data): + """ Converts and sets the satellite position value to a readable format. """ + pos = int(model.get_value(itr, 2)) + renderer.set_property("text", f"{abs(pos / 10):0.1f}{'W' if pos < 0 else 'E'}") + + def sat_pol_func(self, column, renderer, model, itr, data): + renderer.set_property("text", POLARIZATION.get(model.get_value(itr, 2), None)) + + def sat_fec_func(self, column, renderer, model, itr, data): + renderer.set_property("text", FEC.get(model.get_value(itr, 3), None)) + + def sat_sys_func(self, column, renderer, model, itr, data): + renderer.set_property("text", SYSTEM.get(model.get_value(itr, 4), None)) + + def sat_mod_func(self, column, renderer, model, itr, data): + renderer.set_property("text", MODULATION.get(model.get_value(itr, 5), None)) + + def ter_sys_func(self, column, renderer, model, itr, data): + renderer.set_property("text", T_SYSTEM.get(model.get_value(itr, 1), None)) + + def ter_bandwidth_func(self, column, renderer, model, itr, data): + renderer.set_property("text", BANDWIDTH.get(model.get_value(itr, 2), None)) + + def ter_constellation_func(self, column, renderer, model, itr, data): + renderer.set_property("text", CONSTELLATION.get(model.get_value(itr, 3), None)) + + def ter_fec_hp_func(self, column, renderer, model, itr, data): + renderer.set_property("text", T_FEC.get(model.get_value(itr, 4), None)) + + def ter_fec_lp_func(self, column, renderer, model, itr, data): + renderer.set_property("text", T_FEC.get(model.get_value(itr, 5), None)) + + def ter_guard_func(self, column, renderer, model, itr, data): + renderer.set_property("text", GUARD_INTERVAL.get(model.get_value(itr, 6), None)) + + def ter_transmission_func(self, column, renderer, model, itr, data): + renderer.set_property("text", TRANSMISSION_MODE.get(model.get_value(itr, 7), None)) + + def ter_hierarchy_func(self, column, renderer, model, itr, data): + renderer.set_property("text", HIERARCHY.get(model.get_value(itr, 8), None)) + + def ter_inversion_func(self, column, renderer, model, itr, data): + value = model.get_value(itr, 9) + if value: + value = Inversion(value).name + renderer.set_property("text", value) + + def cable_fec_func(self, column, renderer, model, itr, data): + renderer.set_property("text", FEC_DEFAULT.get(model.get_value(itr, 2), None)) + + def cable_mod_func(self, column, renderer, model, itr, data): + renderer.set_property("text", C_MODULATION.get(model.get_value(itr, 3), None)) + def on_satellite_view_realize(self, view): self.load_satellites_list() def on_terrestrial_view_realize(self, view): - gen = self.on_terrestrial_list_load() - GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + self.load_terrestrial_list() def on_cable_view_realize(self, view): - gen = self.on_cable_list_load() - GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + self.load_cable_list() def load_satellites_list(self, path=None): gen = self.on_satellites_list_load(path) GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + def load_terrestrial_list(self, path=None): + gen = self.on_terrestrial_list_load(path) + GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + + def load_cable_list(self, path=None): + gen = self.on_cable_list_load(path) + GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + def on_visible_page(self, stack, param): self._dvb_type = self.DVB(stack.get_visible_child_name()) self._transponders_stack.set_visible_child_name(self._dvb_type) @@ -136,7 +231,8 @@ class SatellitesTool(Gtk.Box): self._current_sat_path, column = view.get_cursor() if self._current_sat_path: - list(map(model.append, view.get_model()[self._current_sat_path][-1])) + sat_model = view.get_model() + list(map(model.append, sat_model[self._current_sat_path][-1])) def on_terrestrial_selection(self, view): model = self._ter_tr_view.get_model() @@ -144,7 +240,8 @@ class SatellitesTool(Gtk.Box): self._current_ter_path, column = view.get_cursor() if self._current_ter_path: - list(map(model.append, view.get_model()[self._current_ter_path][-1])) + ter_model = view.get_model() + list(map(model.append, ter_model[self._current_ter_path][-1])) def on_cable_selection(self, view): model = self._cable_tr_view.get_model() @@ -152,7 +249,8 @@ class SatellitesTool(Gtk.Box): self._current_cable_path, column = view.get_cursor() if self._current_cable_path: - list(map(model.append, view.get_model()[self._current_cable_path][-1])) + cable_model = view.get_model() + list(map(model.append, cable_model[self._current_cable_path][-1])) def on_up(self, item): move_items(KeyboardKey.UP, self._satellite_view) @@ -167,7 +265,7 @@ class SatellitesTool(Gtk.Box): else: on_popup_menu(menu, event) - def on_key_release(self, view, event): + def on_key_press(self, view, event): """ Handling keystrokes """ key_code = event.hardware_keycode if not KeyboardKey.value_exist(key_code): @@ -192,15 +290,15 @@ class SatellitesTool(Gtk.Box): def on_satellites_list_load(self, path=None): """ Load satellites data into model """ - path = path or self._settings.profile_data_path + "satellites.xml" + path = path or f"{self._settings.profile_data_path}satellites.xml" yield from self.load_data(self._satellite_view, get_satellites, path) def on_terrestrial_list_load(self, path=None): - path = path or self._settings.profile_data_path + "terrestrial.xml" + path = path or f"{self._settings.profile_data_path}terrestrial.xml" yield from self.load_data(self._terrestrial_view, get_terrestrial, path) def on_cable_list_load(self, path=None): - path = path or self._settings.profile_data_path + "cables.xml" + path = path or f"{self._settings.profile_data_path}cables.xml" yield from self.load_data(self._cable_view, get_cable, path) def load_data(self, view, func, path): @@ -227,9 +325,6 @@ class SatellitesTool(Gtk.Box): else: self._app.show_error_message("Not implemented yet!") - def on_satellite_add(self, item): - self.on_satellite() - def on_transponder_add(self, item): if self._dvb_type is self.DVB.SAT: self.on_transponder() @@ -328,22 +423,34 @@ class SatellitesTool(Gtk.Box): else: self._app.show_error_message("Not implemented yet!") - def sat_pos_func(self, column, renderer, model, itr, data): - """ Converts and sets the satellite position value to a readable format. """ - pos = int(model.get_value(itr, 2)) - renderer.set_property("text", f"{abs(pos / 10):0.1f}{'W' if pos < 0 else 'E'}") - @run_idle def on_open(self): - response = get_chooser_dialog(self._app.app_window, self._settings, "satellites.xml", ("*.xml",)) + xml_file = "satellites.xml" + if self._dvb_type is self.DVB.TERRESTRIAL: + xml_file = "terrestrial.xml" + elif self._dvb_type is self.DVB.CABLE: + xml_file = "cables.xml" + + response = get_chooser_dialog(self._app.app_window, self._settings, xml_file, ("*.xml",)) if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT): return - if not str(response).endswith("satellites.xml"): - self._app.show_error_message("No satellites.xml file is selected!") + if not str(response).endswith(xml_file): + self._app.show_error_message(f"No {xml_file} file is selected!") return - self.load_satellites_list(response) + if self._dvb_type is self.DVB.SAT: + self.load_satellites_list(response) + elif self._dvb_type is self.DVB.TERRESTRIAL: + self.load_terrestrial_list(response) + else: + self.load_cable_list(response) + + @run_idle + def on_profile_changed(self, app, profile): + self.load_satellites_list() + self.load_terrestrial_list() + self.load_cable_list() @run_idle def on_save(self, app, page): diff --git a/app/ui/xml/editor.glade b/app/ui/xml/editor.glade index 4e7e9dd0..a3d91b81 100644 --- a/app/ui/xml/editor.glade +++ b/app/ui/xml/editor.glade @@ -354,7 +354,7 @@ Author: Dmitriy Yefremov True - + @@ -745,7 +745,7 @@ Author: Dmitriy Yefremov True both - + multiple @@ -759,7 +759,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -776,7 +776,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -793,7 +793,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -810,7 +810,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -827,7 +827,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -844,7 +844,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -860,7 +860,7 @@ Author: Dmitriy Yefremov Pls mode True - + 6 @@ -874,7 +874,7 @@ Author: Dmitriy Yefremov Pls code True - + 7 @@ -888,7 +888,7 @@ Author: Dmitriy Yefremov Is ID True - + 8 @@ -900,7 +900,7 @@ Author: Dmitriy Yefremov False T2-MI PLP ID - + 9 @@ -995,7 +995,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1012,7 +1012,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1029,7 +1029,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1046,7 +1046,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1063,7 +1063,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1077,7 +1077,9 @@ Author: Dmitriy Yefremov SR (LP) - + + 0.49000000953674316 + 5 @@ -1092,7 +1094,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1107,7 +1109,9 @@ Author: Dmitriy Yefremov Transmission True - + + 0.49000000953674316 + 7 @@ -1120,7 +1124,9 @@ Author: Dmitriy Yefremov Hierarchy True - + + 0.49000000953674316 + 8 @@ -1133,7 +1139,9 @@ Author: Dmitriy Yefremov Inversion True - + + 0.49000000953674316 + 9 @@ -1229,7 +1237,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1246,7 +1254,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1263,7 +1271,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1280,7 +1288,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316