From 3b510e6935d19cd14b46ab8745f7b2eebfc73565 Mon Sep 17 00:00:00 2001 From: DYefremov Date: Mon, 1 Aug 2022 22:55:38 +0300 Subject: [PATCH] terrestrial and cable dialogs skeleton --- app/ui/xml/dialogs.glade | 369 +++++++++++++++++++++++++++++++++++++++ app/ui/xml/dialogs.py | 191 +++++++++++++++----- app/ui/xml/edit.py | 13 +- 3 files changed, 530 insertions(+), 43 deletions(-) diff --git a/app/ui/xml/dialogs.glade b/app/ui/xml/dialogs.glade index 587f6fdd..33c5cd5a 100644 --- a/app/ui/xml/dialogs.glade +++ b/app/ui/xml/dialogs.glade @@ -33,6 +33,115 @@ Author: Dmitriy Yefremov + + True + False + 5 + 5 + 5 + 5 + + + True + False + Freq + + + 0 + 0 + + + + + True + False + Rate + + + 1 + 0 + + + + + True + True + 12 + 14 + document-edit-symbolic + 6900000 + digits + + + + 1 + 1 + + + + + True + False + FEC + + + 2 + 0 + + + + + True + False + Mod + + + 3 + 0 + + + + + True + True + 12 + 14 + document-edit-symbolic + False + False + False + 120000 + digits + + + + 0 + 1 + + + + + 75 + True + False + + + 2 + 1 + + + + + 100 + True + False + + + 3 + 1 + + + @@ -585,4 +694,264 @@ Author: Dmitriy Yefremov + + True + False + 5 + 5 + 5 + vertical + 5 + + + True + False + 5 + + + True + False + Freq + + + 0 + 0 + + + + + True + True + 12 + 14 + document-edit-symbolic + False + False + False + 11700000 + digits + + + + 0 + 1 + + + + + True + False + System + + + 1 + 0 + + + + + 100 + True + False + + + 1 + 1 + + + + + 110 + True + False + + + 2 + 1 + + + + + True + False + Bandwidth + + + 2 + 0 + + + + + True + False + Constellation + + + 3 + 0 + + + + + True + False + SR (HP) + + + 4 + 0 + + + + + True + False + SR (LP) + + + 5 + 0 + + + + + 75 + True + False + + + 4 + 1 + + + + + 75 + True + False + + + 5 + 1 + + + + + 100 + True + False + + + 3 + 1 + + + + + False + True + 0 + + + + + True + False + center + 5 + 5 + True + + + True + False + Guard + + + 0 + 0 + + + + + True + False + Transmission + + + 1 + 0 + + + + + True + False + Hierarchy + + + 2 + 0 + + + + + True + False + Inversion + + + 3 + 0 + + + + + True + False + + + 0 + 1 + + + + + True + False + + + 1 + 1 + + + + + True + False + + + 2 + 1 + + + + + True + False + + + 3 + 1 + + + + + False + True + 1 + + + diff --git a/app/ui/xml/dialogs.py b/app/ui/xml/dialogs.py index 37c7d983..480a8140 100644 --- a/app/ui/xml/dialogs.py +++ b/app/ui/xml/dialogs.py @@ -36,7 +36,9 @@ 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, POLARIZATION, FEC, SYSTEM, MODULATION, Terrestrial, Cable +from app.eparser.ecommons import (PLS_MODE, get_key_by_value, POLARIZATION, FEC, SYSTEM, MODULATION, Terrestrial, Cable, + T_SYSTEM, BANDWIDTH, CONSTELLATION, T_FEC, GUARD_INTERVAL, TRANSMISSION_MODE, + HIERARCHY, Inversion, C_MODULATION, FEC_DEFAULT) from app.tools.satellites import SatellitesParser, SatelliteSource, ServicesParser from ..dialogs import show_dialog, DialogType, get_message, get_builder from ..main_helper import append_text_to_tview, get_base_model, on_popup_menu @@ -73,6 +75,41 @@ class DVBDialog(Gtk.Dialog): return self._data +class TransponderDialog(DVBDialog): + """ Base transponder dialog class. """ + + def __init__(self, parent, title, data=None, *args, **kwargs): + super().__init__(parent, title, data, *args, **kwargs) + # Pattern for digits entries. + self.digit_pattern = re.compile(r"\D") + # Style + self.style_provider = Gtk.CssProvider() + self.style_provider.load_from_path(UI_RESOURCES_PATH + "style.css") + + def run(self): + resp = super().run() + while resp == Gtk.ResponseType.OK: + if self.is_accept(): + return resp + show_dialog(DialogType.ERROR, self, "Please check your parameters and try again.") + resp = super().run() + return resp + + def is_accept(self): + return True + + def init_transponder_data(self, data): + self._data = data + + def on_entry_changed(self, entry): + """ Digit entries handler. """ + entry.set_name("digit-entry" if self.digit_pattern.search(entry.get_text()) else "GtkEntry") + + def set_style_provider(self, widget): + context = widget.get_style_context() + context.add_provider_for_screen(Gdk.Screen.get_default(), self.style_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) + + class TCDialog(DVBDialog): def __init__(self, parent, title=None, data=None, *args, **kwargs): super().__init__(parent, title, data, *args, **kwargs) @@ -139,7 +176,7 @@ class CableDialog(TCDialog): return self._data._replace(name=name) if self._data else Cable(name, "true", "9", None, []) -class SatTransponderDialog(DVBDialog): +class SatTransponderDialog(TransponderDialog): """ Dialog for adding or edit satellite transponder. """ def __init__(self, transient, title, data=None, *args, **kwargs): @@ -160,43 +197,29 @@ class SatTransponderDialog(DVBDialog): self._pls_code_entry = builder.get_object("pls_code_entry") self._is_id_entry = builder.get_object("is_id_entry") self._t2mi_plp_id_entry = builder.get_object("t2mi_plp_id_entry") - # pattern for frequency and rate entries (only digits) - self._pattern = re.compile(r"\D") - # style - self._style_provider = Gtk.CssProvider() - self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css") - self._freq_entry.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider, - Gtk.STYLE_PROVIDER_PRIORITY_USER) - self._rate_entry.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider, - Gtk.STYLE_PROVIDER_PRIORITY_USER) - self.show_all() - if data: - self.init_transponder(data) - def run(self): - resp = super().run() - while resp == Gtk.ResponseType.OK: - if self.is_accept(): - return resp - show_dialog(DialogType.ERROR, self, "Please check your parameters and try again.") - resp = super().run() - return resp + self.set_style_provider(self._freq_entry) + self.set_style_provider(self._rate_entry) + self.show_all() + + self.init_transponder_data(data) @property def data(self): return self.to_transponder() - 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(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 "") - self._t2mi_plp_id_entry.set_text(transponder.t2mi_plp_id if transponder.t2mi_plp_id else "") + def init_transponder_data(self, transponder): + if transponder: + self._freq_entry.set_text(transponder.frequency) + self._rate_entry.set_text(transponder.symbol_rate) + 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 "") + self._t2mi_plp_id_entry.set_text(transponder.t2mi_plp_id if transponder.t2mi_plp_id else "") def to_transponder(self): return Transponder(frequency=self._freq_entry.get_text(), @@ -210,25 +233,113 @@ class SatTransponderDialog(DVBDialog): is_id=self._is_id_entry.get_text(), t2mi_plp_id=self._t2mi_plp_id_entry.get_text()) - def on_entry_changed(self, entry): - entry.set_name("digit-entry" if self._pattern.search(entry.get_text()) else "GtkEntry") - def is_accept(self): tr = self.to_transponder() - if self._pattern.search(tr.frequency) or not tr.frequency: + if self.digit_pattern.search(tr.frequency) or not tr.frequency: return False - elif self._pattern.search(tr.symbol_rate) or not tr.symbol_rate: + elif self.digit_pattern.search(tr.symbol_rate) or not tr.symbol_rate: return False elif None in (tr.polarization, tr.fec_inner, tr.system, tr.modulation): return False - elif self._pattern.search(tr.pls_code) or self._pattern.search(tr.is_id): + elif self.digit_pattern.search(tr.pls_code) or self.digit_pattern.search(tr.is_id): return False - elif self._pattern.search(tr.t2mi_plp_id): + elif self.digit_pattern.search(tr.t2mi_plp_id): return False return True +class TerTransponderDialog(TransponderDialog): + """ Dialog for adding or edit terrestrial transponder. """ + + def __init__(self, transient, title, data=None, *args, **kwargs): + super().__init__(transient, title, data, *args, **kwargs) + + handlers = {"on_entry_changed": self.on_entry_changed} + builder = get_builder(_DIALOGS_UI_PATH, handlers, use_str=True, objects=("ter_tr_box",)) + + self.frame.add(builder.get_object("ter_tr_box")) + self._freq_entry = builder.get_object("ter_freq_entry") + self._sys_box = builder.get_object("ter_sys_box") + self._bandwidth_box = builder.get_object("ter_bandwidth_box") + self._constellation_box = builder.get_object("ter_constellation_box") + self._sr_hp_box = builder.get_object("ter_sr_hp_box") + self._sr_lp_box = builder.get_object("ter_sr_lp_box") + self._guard_box = builder.get_object("ter_guard_box") + self._transmission_box = builder.get_object("ter_transmission_box") + self._hierarchy_box = builder.get_object("ter_hierarchy_box") + self._inversion_box = builder.get_object("ter_inversion_box") + + self.set_style_provider(self._freq_entry) + self.show_all() + + self.init_transponder_data(data) + + def init_transponder_data(self, transponder): + if transponder: + self._freq_entry.set_text(transponder.centre_frequency) + [self._sys_box.append(k, v) for k, v in T_SYSTEM.items()] + self._sys_box.set_active_id(transponder.system) + [self._bandwidth_box.append(k, v) for k, v in BANDWIDTH.items()] + self._bandwidth_box.set_active_id(transponder.bandwidth) + [self._constellation_box.append(k, v) for k, v in CONSTELLATION.items()] + self._constellation_box.set_active_id(transponder.constellation) + [self._sr_hp_box.append(k, v) for k, v in T_FEC.items()] + self._sr_hp_box.set_active_id(transponder.code_rate_hp) + [self._sr_lp_box.append(k, v) for k, v in T_FEC.items()] + self._sr_lp_box.set_active_id(transponder.code_rate_lp) + [self._guard_box.append(k, v) for k, v in GUARD_INTERVAL.items()] + self._guard_box.set_active_id(transponder.guard_interval) + [self._transmission_box.append(k, v) for k, v in TRANSMISSION_MODE.items()] + self._transmission_box.set_active_id(transponder.transmission_mode) + [self._hierarchy_box.append(k, v) for k, v in HIERARCHY.items()] + self._hierarchy_box.set_active_id(transponder.hierarchy_information) + [self._inversion_box.append(k.value, k.name) for k in Inversion] + self._inversion_box.set_active_id(transponder.inversion) + + def is_accept(self): + return not self.digit_pattern.search(self._freq_entry.get_text()) + + +class CableTransponderDialog(TransponderDialog): + """ Dialog for adding or edit cable transponder. """ + + def __init__(self, transient, title, data=None, *args, **kwargs): + super().__init__(transient, title, data, *args, **kwargs) + + handlers = {"on_entry_changed": self.on_entry_changed} + builder = get_builder(_DIALOGS_UI_PATH, handlers, use_str=True, objects=("cable_tr_box",)) + + self.frame.add(builder.get_object("cable_tr_box")) + + self._freq_entry = builder.get_object("cable_freq_entry") + self._rate_entry = builder.get_object("cable_rate_entry") + self._fec_box = builder.get_object("cable_fec_box") + self._mod_box = builder.get_object("cable_mod_box") + + self.set_style_provider(self._freq_entry) + self.set_style_provider(self._rate_entry) + self.show_all() + + self.init_transponder_data(data) + + def init_transponder_data(self, transponder): + if transponder: + self._freq_entry.set_text(transponder.frequency) + self._rate_entry.set_text(transponder.symbol_rate) + [self._fec_box.append(k, v) for k, v in FEC_DEFAULT.items()] + self._fec_box.set_active_id(transponder.fec_inner) + [self._mod_box.append(k, v) for k, v in C_MODULATION.items()] + self._mod_box.set_active_id(transponder.modulation) + + def is_accept(self): + if self.digit_pattern.search(self._freq_entry.get_text()): + return False + elif self.digit_pattern.search(self._rate_entry.get_text()): + return False + return True + + # ********************** Update dialogs ************************ # class UpdateDialog: diff --git a/app/ui/xml/edit.py b/app/ui/xml/edit.py index 1c403d61..63315770 100644 --- a/app/ui/xml/edit.py +++ b/app/ui/xml/edit.py @@ -36,9 +36,10 @@ 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, - Terrestrial, Cable) + Terrestrial, Cable, CableTransponder, TerTransponder) from app.eparser.satxml import get_terrestrial, get_cable, write_terrestrial, write_cable -from .dialogs import SatelliteDialog, SatellitesUpdateDialog, TerrestrialDialog, CableDialog, SatTransponderDialog +from .dialogs import SatelliteDialog, SatellitesUpdateDialog, TerrestrialDialog, CableDialog, SatTransponderDialog, \ + CableTransponderDialog, TerTransponderDialog from ..dialogs import show_dialog, DialogType, get_chooser_dialog, get_message, get_builder from ..main_helper import move_items, on_popup_menu from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, MOVE_KEYS, KeyboardKey, MOD_MASK, Page @@ -357,7 +358,7 @@ class SatellitesTool(Gtk.Box): def on_transponder_add(self, item): if self._dvb_type is self.DVB.SAT: - self.on_transponder() + self.on_edit(force=True) else: self._app.show_error_message("Not implemented yet!") @@ -384,6 +385,12 @@ class SatellitesTool(Gtk.Box): elif view is self._sat_tr_view: data = None if force else Transponder(*row) self.on_transponder_data_edit(SatTransponderDialog, "Transponder", view, self._satellite_view, data, itr) + elif view is self._ter_tr_view: + data = None if force else TerTransponder(*row) + self.on_transponder_data_edit(TerTransponderDialog, "Transponder", view, self._terrestrial_view, data, itr) + elif view is self._cable_tr_view: + data = None if force else CableTransponder(*row) + self.on_transponder_data_edit(CableTransponderDialog, "Transponder", view, self._cable_view, data, itr) else: self._app.show_error_message("Not implemented yet!")