xml data rendering refactoring

This commit is contained in:
DYefremov
2022-07-02 18:40:26 +03:00
parent c1c5e866ad
commit c2fd116252
4 changed files with 199 additions and 86 deletions

View File

@@ -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:

View File

@@ -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(),

View File

@@ -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):

View File

@@ -354,7 +354,7 @@ Author: Dmitriy Yefremov
<property name="activate_on_single_click">True</property>
<signal name="button-press-event" handler="on_button_press" object="popup_menu" swapped="no"/>
<signal name="cursor-changed" handler="on_satellite_selection" swapped="no"/>
<signal name="key-release-event" handler="on_key_release" swapped="no"/>
<signal name="key-press-event" handler="on_key_press" swapped="no"/>
<signal name="realize" handler="on_satellite_view_realize" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="satellite_view_selection">
@@ -745,7 +745,7 @@ Author: Dmitriy Yefremov
<property name="rubber_banding">True</property>
<property name="enable_grid_lines">both</property>
<signal name="button-press-event" handler="on_button_press" object="transponder_popup_menu" swapped="no"/>
<signal name="key-release-event" handler="on_key_release" swapped="no"/>
<signal name="key-press-event" handler="on_key_press" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="sat_tr_view_selection">
<property name="mode">multiple</property>
@@ -759,7 +759,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="frequency_cellrenderertext">
<object class="GtkCellRendererText" id="frequency_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -776,7 +776,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="sat_rate_cellrenderertext">
<object class="GtkCellRendererText" id="sat_rate_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -793,7 +793,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="sat_pol_cellrenderertext">
<object class="GtkCellRendererText" id="sat_pol_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -810,7 +810,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="set_fec_cellrenderertext">
<object class="GtkCellRendererText" id="sat_fec_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -827,7 +827,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="sys_cellrenderertext">
<object class="GtkCellRendererText" id="sat_sys_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -844,7 +844,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="mod_cellrenderertext">
<object class="GtkCellRendererText" id="sat_mod_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -860,7 +860,7 @@ Author: Dmitriy Yefremov
<property name="title" translatable="yes">Pls mode</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="pls_mode_cellrenderertext"/>
<object class="GtkCellRendererText" id="pls_mode_renderer"/>
<attributes>
<attribute name="text">6</attribute>
</attributes>
@@ -874,7 +874,7 @@ Author: Dmitriy Yefremov
<property name="title" translatable="yes">Pls code</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="pls_code_cellrenderertext"/>
<object class="GtkCellRendererText" id="pls_code_renderer"/>
<attributes>
<attribute name="text">7</attribute>
</attributes>
@@ -888,7 +888,7 @@ Author: Dmitriy Yefremov
<property name="title" translatable="yes">Is ID</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="is_id_cellrenderertext"/>
<object class="GtkCellRendererText" id="is_id_renderer"/>
<attributes>
<attribute name="text">8</attribute>
</attributes>
@@ -900,7 +900,7 @@ Author: Dmitriy Yefremov
<property name="visible">False</property>
<property name="title" translatable="yes">T2-MI PLP ID</property>
<child>
<object class="GtkCellRendererText" id="t2mi_plp_id_cellrenderertext"/>
<object class="GtkCellRendererText" id="t2mi_plp_id_renderer"/>
<attributes>
<attribute name="text">9</attribute>
</attributes>
@@ -995,7 +995,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_freq_cellrenderer">
<object class="GtkCellRendererText" id="ter_freq_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1012,7 +1012,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_system_cellrenderer">
<object class="GtkCellRendererText" id="ter_system_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1029,7 +1029,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_bandwidth_cellrenderer">
<object class="GtkCellRendererText" id="ter_bandwidth_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1046,7 +1046,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_constellation_cellrenderer">
<object class="GtkCellRendererText" id="ter_constellation_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1063,7 +1063,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_rate_hp_cellrenderer">
<object class="GtkCellRendererText" id="ter_rate_hp_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1077,7 +1077,9 @@ Author: Dmitriy Yefremov
<object class="GtkTreeViewColumn" id="ter_rate_lp_column">
<property name="title" translatable="yes">SR (LP)</property>
<child>
<object class="GtkCellRendererText" id="ter_rate_lp_cellrenderer"/>
<object class="GtkCellRendererText" id="ter_rate_lp_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">5</attribute>
</attributes>
@@ -1092,7 +1094,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_guard_cellrenderer">
<object class="GtkCellRendererText" id="ter_guard_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1107,7 +1109,9 @@ Author: Dmitriy Yefremov
<property name="title" translatable="yes">Transmission</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_tr_mode_cellrenderer"/>
<object class="GtkCellRendererText" id="ter_tr_mode_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">7</attribute>
</attributes>
@@ -1120,7 +1124,9 @@ Author: Dmitriy Yefremov
<property name="title" translatable="yes">Hierarchy</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_hierarchy_cellrenderer"/>
<object class="GtkCellRendererText" id="ter_hierarchy_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">8</attribute>
</attributes>
@@ -1133,7 +1139,9 @@ Author: Dmitriy Yefremov
<property name="title" translatable="yes">Inversion</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_inversion_cellrenderer"/>
<object class="GtkCellRendererText" id="ter_inversion_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">9</attribute>
</attributes>
@@ -1229,7 +1237,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="cable_frequency_cellrenderer">
<object class="GtkCellRendererText" id="cable_frequency_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1246,7 +1254,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="cable_rate_cellrenderer">
<object class="GtkCellRendererText" id="cable_rate_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1263,7 +1271,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="cable_fec_cellrenderer">
<object class="GtkCellRendererText" id="cable_fec_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1280,7 +1288,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="cable_mod_cellrenderer">
<object class="GtkCellRendererText" id="cable_mod_renderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>