transponder dialog refactoring

This commit is contained in:
DYefremov
2022-08-01 18:19:15 +03:00
parent ca20852bfe
commit f3a6d2bd9c
3 changed files with 460 additions and 536 deletions

View File

@@ -153,17 +153,7 @@ Author: Dmitriy Yefremov
</row>
</data>
</object>
<object class="GtkFrame" id="satellite_dialog_frame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label_xalign">0.019999999552965164</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkGrid" id="satellite_dialog_box">
<object class="GtkGrid" id="sat_dialog_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
@@ -248,15 +238,6 @@ Author: Dmitriy Yefremov
<placeholder/>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="satellite_dialog_frame_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Satellite properties:</property>
</object>
</child>
</object>
<object class="GtkListStore" id="system_store">
<columns>
<!-- column-name system -->
@@ -271,54 +252,7 @@ Author: Dmitriy Yefremov
</row>
</data>
</object>
<object class="GtkDialog" id="transponder_dialog">
<property name="use-header-bar">{use_header}</property>
<property name="width_request">320</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Transponder</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="default_width">320</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property>
<property name="skip_pager_hint">True</property>
<child type="action">
<object class="GtkButton" id="tr_cancel_button">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="valign">center</property>
</object>
</child>
<child type="action">
<object class="GtkButton" id="tr_ok_button">
<property name="label" translatable="yes">OK</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="valign">center</property>
</object>
</child>
<child internal-child="vbox">
<object class="GtkBox" id="tr_dialog_vbox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkFrame" id="transponder_dialog_frame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label_xalign">0.02</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkBox" id="tr_box">
<object class="GtkBox" id="sat_tr_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
@@ -327,12 +261,12 @@ Author: Dmitriy Yefremov
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkGrid" id="tr_dialog_grid">
<object class="GtkGrid" id="sat_tr_dialog_grid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="column_spacing">5</property>
<child>
<object class="GtkLabel" id="label1">
<object class="GtkLabel" id="sat_freq_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Freq</property>
@@ -343,7 +277,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<object class="GtkLabel" id="sat_rate_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Rate</property>
@@ -354,7 +288,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<object class="GtkLabel" id="sat_pol_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Pol</property>
@@ -365,7 +299,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkLabel" id="label4">
<object class="GtkLabel" id="sat_fec_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">FEC</property>
@@ -376,7 +310,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkLabel" id="label5">
<object class="GtkLabel" id="sat_sys_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">System</property>
@@ -387,7 +321,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkLabel" id="label6">
<object class="GtkLabel" id="sat_mod_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Mod</property>
@@ -651,26 +585,4 @@ Author: Dmitriy Yefremov
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="transponder_dialog_frame_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Transponder properties:</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">tr_cancel_button</action-widget>
<action-widget response="-5">tr_ok_button</action-widget>
</action-widgets>
</object>
</interface>

View File

@@ -55,10 +55,17 @@ class DVBDialog(Gtk.Dialog):
modal=True,
resizable=False,
default_width=320,
skip_taskbar_hint=True,
skip_pager_hint=True,
destroy_with_parent=True,
use_header_bar=IS_GNOME_SESSION,
window_position=Gtk.WindowPosition.CENTER_ON_PARENT,
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK),
*args, **kwargs)
self.frame = Gtk.Frame(margin=5, label_xalign=0.02)
self.get_content_area().pack_start(self.frame, True, True, 0)
self._data = data
@property
@@ -70,10 +77,9 @@ class TCDialog(DVBDialog):
def __init__(self, parent, title=None, data=None, *args, **kwargs):
super().__init__(parent, title, data, *args, **kwargs)
self.frame = Gtk.Frame(margin=5, label=get_message("Name:"), label_xalign=0.02)
self._entry = Gtk.Entry(margin=5)
self.frame.add(self._entry)
self.get_content_area().pack_start(self.frame, True, True, 0)
self.frame.set_label(get_message("Name:"))
self.show_all()
if data:
@@ -86,13 +92,14 @@ class SatelliteDialog(DVBDialog):
def __init__(self, transient, title, satellite=None, *args, **kwargs):
super().__init__(transient, title, *args, **kwargs)
builder = get_builder(_DIALOGS_UI_PATH, use_str=True,
objects=("satellite_dialog_frame", "side_store", "pos_adjustment"))
objects=("sat_dialog_box", "side_store", "pos_adjustment"))
self.get_content_area().pack_start(builder.get_object("satellite_dialog_frame"), True, True, 0)
self.frame.add(builder.get_object("sat_dialog_box"))
self._sat_name = builder.get_object("sat_name_entry")
self._sat_position = builder.get_object("sat_position_button")
self._side = builder.get_object("side_box")
self._transponders = satellite.transponders if satellite else []
self.show_all()
if satellite:
self._sat_name.set_text(satellite.name)
@@ -132,17 +139,17 @@ class CableDialog(TCDialog):
return self._data._replace(name=name) if self._data else Cable(name, "true", "9", None, [])
class TransponderDialog:
""" Shows dialog for adding or edit transponder """
class SatTransponderDialog(DVBDialog):
""" Dialog for adding or edit satellite transponder. """
def __init__(self, transient, transponder: Transponder = None):
def __init__(self, transient, title, data=None, *args, **kwargs):
super().__init__(transient, title, data, *args, **kwargs)
handlers = {"on_entry_changed": self.on_entry_changed}
objects = ("transponder_dialog", "pol_store", "fec_store", "mod_store", "system_store", "pls_mode_store")
objects = ("sat_tr_box", "pol_store", "fec_store", "mod_store", "system_store", "pls_mode_store")
builder = get_builder(_DIALOGS_UI_PATH, handlers, use_str=True, objects=objects)
self._dialog = builder.get_object("transponder_dialog")
self._dialog.set_transient_for(transient)
self.frame.add(builder.get_object("sat_tr_box"))
self._freq_entry = builder.get_object("freq_entry")
self._rate_entry = builder.get_object("rate_entry")
self._pol_box = builder.get_object("pol_box")
@@ -162,18 +169,22 @@ class TransponderDialog:
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)
if transponder:
self.init_transponder(transponder)
self.show_all()
if data:
self.init_transponder(data)
def run(self):
while self._dialog.run() != Gtk.ResponseType.CANCEL:
tr = self.to_transponder()
if self.is_accept(tr):
return tr
show_dialog(DialogType.ERROR, self._dialog, "Please check your parameters and try again.")
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 destroy(self):
self._dialog.destroy()
@property
def data(self):
return self.to_transponder()
def init_transponder(self, transponder):
self._freq_entry.set_text(transponder.frequency)
@@ -202,7 +213,8 @@ class TransponderDialog:
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):
def is_accept(self):
tr = self.to_transponder()
if self._pattern.search(tr.frequency) or not tr.frequency:
return False
elif self._pattern.search(tr.symbol_rate) or not tr.symbol_rate:

View File

@@ -38,7 +38,7 @@ from app.eparser.ecommons import (POLARIZATION, FEC, SYSTEM, MODULATION, T_SYSTE
GUARD_INTERVAL, TRANSMISSION_MODE, HIERARCHY, Inversion, FEC_DEFAULT, C_MODULATION,
Terrestrial, Cable)
from app.eparser.satxml import get_terrestrial, get_cable, write_terrestrial, write_cable
from .dialogs import SatelliteDialog, TransponderDialog, SatellitesUpdateDialog, TerrestrialDialog, CableDialog
from .dialogs import SatelliteDialog, SatellitesUpdateDialog, TerrestrialDialog, CableDialog, SatTransponderDialog
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
@@ -377,17 +377,18 @@ class SatellitesTool(Gtk.Box):
if view is self._satellite_view:
self.on_dvb_data_edit(SatelliteDialog, "Satellite", view, None if force else Satellite(*row), itr)
elif view is self._sat_tr_view:
self.on_transponder(None if force else Transponder(*row), itr)
elif view is self._terrestrial_view:
self.on_dvb_data_edit(TerrestrialDialog, "Region", view, None if force else Terrestrial(*row), itr)
elif view is self._cable_view:
self.on_dvb_data_edit(CableDialog, "Provider", view, None if force else Cable(*row), itr)
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)
else:
self._app.show_error_message("Not implemented yet!")
def on_dvb_data_edit(self, dialog, title, view, data=None, edited_itr=None):
""" Create or edit satellite. """
""" Creates or edits DVB data. """
dialog = dialog(self._app.get_active_window(), title, data)
if dialog.run() == Gtk.ResponseType.OK:
dvb_data = dialog.data
@@ -403,32 +404,31 @@ class SatellitesTool(Gtk.Box):
model.append(dvb_data)
dialog.destroy()
def on_transponder(self, transponder=None, edited_itr=None):
""" Create or edit transponder. """
paths = self.check_selection(self._satellite_view, "Please, select only one satellite!")
def on_transponder_data_edit(self, dialog, title, view, src_view, data=None, edited_itr=None):
""" Creates or edits transponder data. """
paths = self.check_selection(src_view, "Please, select only one item!")
if paths is None:
return
elif len(paths) == 0:
self._app.show_error_message("No satellite is selected!")
self._app.show_error_message("No source selected!")
return
dialog = TransponderDialog(self._app.get_active_window(), transponder)
tr = dialog.run()
dialog.destroy()
dialog = dialog(self._app.app_window, title, data)
if dialog.run() == Gtk.ResponseType.OK:
tr = dialog.data
if tr:
sat_model = self._satellite_view.get_model()
transponders = sat_model[paths][-1]
tr_model, tr_paths = self._sat_tr_view.get_selection().get_selected_rows()
src_model = src_view.get_model()
transponders = src_model[paths][-1]
tr_model, tr_paths = view.get_selection().get_selected_rows()
if transponder and edited_itr:
if data and edited_itr:
tr_model.set(edited_itr, {i: v for i, v in enumerate(tr)})
transponders[tr_model.get_path(edited_itr).get_indices()[0]] = tr
else:
index = paths[0].get_indices()[0] + 1
tr_model.insert(index, tr)
transponders.insert(index, tr)
dialog.destroy()
def check_selection(self, view, message):
""" Checks if any row is selected. Shows error dialog if selected more than one.