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> </row>
</data> </data>
</object> </object>
<object class="GtkFrame" id="satellite_dialog_frame"> <object class="GtkGrid" id="sat_dialog_box">
<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">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="margin_left">5</property> <property name="margin_left">5</property>
@@ -248,15 +238,6 @@ Author: Dmitriy Yefremov
<placeholder/> <placeholder/>
</child> </child>
</object> </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"> <object class="GtkListStore" id="system_store">
<columns> <columns>
<!-- column-name system --> <!-- column-name system -->
@@ -271,54 +252,7 @@ Author: Dmitriy Yefremov
</row> </row>
</data> </data>
</object> </object>
<object class="GtkDialog" id="transponder_dialog"> <object class="GtkBox" id="sat_tr_box">
<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">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="margin_left">5</property> <property name="margin_left">5</property>
@@ -327,12 +261,12 @@ Author: Dmitriy Yefremov
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">2</property> <property name="spacing">2</property>
<child> <child>
<object class="GtkGrid" id="tr_dialog_grid"> <object class="GtkGrid" id="sat_tr_dialog_grid">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="column_spacing">5</property> <property name="column_spacing">5</property>
<child> <child>
<object class="GtkLabel" id="label1"> <object class="GtkLabel" id="sat_freq_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Freq</property> <property name="label" translatable="yes">Freq</property>
@@ -343,7 +277,7 @@ Author: Dmitriy Yefremov
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label2"> <object class="GtkLabel" id="sat_rate_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Rate</property> <property name="label" translatable="yes">Rate</property>
@@ -354,7 +288,7 @@ Author: Dmitriy Yefremov
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label3"> <object class="GtkLabel" id="sat_pol_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Pol</property> <property name="label" translatable="yes">Pol</property>
@@ -365,7 +299,7 @@ Author: Dmitriy Yefremov
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label4"> <object class="GtkLabel" id="sat_fec_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">FEC</property> <property name="label" translatable="yes">FEC</property>
@@ -376,7 +310,7 @@ Author: Dmitriy Yefremov
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label5"> <object class="GtkLabel" id="sat_sys_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">System</property> <property name="label" translatable="yes">System</property>
@@ -387,7 +321,7 @@ Author: Dmitriy Yefremov
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label6"> <object class="GtkLabel" id="sat_mod_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Mod</property> <property name="label" translatable="yes">Mod</property>
@@ -651,26 +585,4 @@ Author: Dmitriy Yefremov
</packing> </packing>
</child> </child>
</object> </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> </interface>

View File

@@ -55,10 +55,17 @@ class DVBDialog(Gtk.Dialog):
modal=True, modal=True,
resizable=False, resizable=False,
default_width=320, default_width=320,
skip_taskbar_hint=True,
skip_pager_hint=True,
destroy_with_parent=True,
use_header_bar=IS_GNOME_SESSION, 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), buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK),
*args, **kwargs) *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 self._data = data
@property @property
@@ -70,10 +77,9 @@ class TCDialog(DVBDialog):
def __init__(self, parent, title=None, data=None, *args, **kwargs): def __init__(self, parent, title=None, data=None, *args, **kwargs):
super().__init__(parent, title, data, *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._entry = Gtk.Entry(margin=5)
self.frame.add(self._entry) 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() self.show_all()
if data: if data:
@@ -86,13 +92,14 @@ class SatelliteDialog(DVBDialog):
def __init__(self, transient, title, satellite=None, *args, **kwargs): def __init__(self, transient, title, satellite=None, *args, **kwargs):
super().__init__(transient, title, *args, **kwargs) super().__init__(transient, title, *args, **kwargs)
builder = get_builder(_DIALOGS_UI_PATH, use_str=True, 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_name = builder.get_object("sat_name_entry")
self._sat_position = builder.get_object("sat_position_button") self._sat_position = builder.get_object("sat_position_button")
self._side = builder.get_object("side_box") self._side = builder.get_object("side_box")
self._transponders = satellite.transponders if satellite else [] self._transponders = satellite.transponders if satellite else []
self.show_all()
if satellite: if satellite:
self._sat_name.set_text(satellite.name) 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, []) return self._data._replace(name=name) if self._data else Cable(name, "true", "9", None, [])
class TransponderDialog: class SatTransponderDialog(DVBDialog):
""" Shows dialog for adding or edit transponder """ """ 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} 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) builder = get_builder(_DIALOGS_UI_PATH, handlers, use_str=True, objects=objects)
self._dialog = builder.get_object("transponder_dialog") self.frame.add(builder.get_object("sat_tr_box"))
self._dialog.set_transient_for(transient)
self._freq_entry = builder.get_object("freq_entry") self._freq_entry = builder.get_object("freq_entry")
self._rate_entry = builder.get_object("rate_entry") self._rate_entry = builder.get_object("rate_entry")
self._pol_box = builder.get_object("pol_box") self._pol_box = builder.get_object("pol_box")
@@ -162,18 +169,22 @@ class TransponderDialog:
Gtk.STYLE_PROVIDER_PRIORITY_USER) Gtk.STYLE_PROVIDER_PRIORITY_USER)
self._rate_entry.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider, self._rate_entry.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_USER) Gtk.STYLE_PROVIDER_PRIORITY_USER)
if transponder: self.show_all()
self.init_transponder(transponder) if data:
self.init_transponder(data)
def run(self): def run(self):
while self._dialog.run() != Gtk.ResponseType.CANCEL: resp = super().run()
tr = self.to_transponder() while resp == Gtk.ResponseType.OK:
if self.is_accept(tr): if self.is_accept():
return tr return resp
show_dialog(DialogType.ERROR, self._dialog, "Please check your parameters and try again.") show_dialog(DialogType.ERROR, self, "Please check your parameters and try again.")
resp = super().run()
return resp
def destroy(self): @property
self._dialog.destroy() def data(self):
return self.to_transponder()
def init_transponder(self, transponder): def init_transponder(self, transponder):
self._freq_entry.set_text(transponder.frequency) self._freq_entry.set_text(transponder.frequency)
@@ -202,7 +213,8 @@ class TransponderDialog:
def on_entry_changed(self, entry): def on_entry_changed(self, entry):
entry.set_name("digit-entry" if self._pattern.search(entry.get_text()) else "GtkEntry") 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: if self._pattern.search(tr.frequency) or not tr.frequency:
return False return False
elif self._pattern.search(tr.symbol_rate) or not tr.symbol_rate: 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, GUARD_INTERVAL, TRANSMISSION_MODE, HIERARCHY, Inversion, FEC_DEFAULT, C_MODULATION,
Terrestrial, Cable) Terrestrial, Cable)
from app.eparser.satxml import get_terrestrial, get_cable, write_terrestrial, write_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 ..dialogs import show_dialog, DialogType, get_chooser_dialog, get_message, get_builder
from ..main_helper import move_items, on_popup_menu from ..main_helper import move_items, on_popup_menu
from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, MOVE_KEYS, KeyboardKey, MOD_MASK, Page 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: if view is self._satellite_view:
self.on_dvb_data_edit(SatelliteDialog, "Satellite", view, None if force else Satellite(*row), itr) 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: elif view is self._terrestrial_view:
self.on_dvb_data_edit(TerrestrialDialog, "Region", view, None if force else Terrestrial(*row), itr) self.on_dvb_data_edit(TerrestrialDialog, "Region", view, None if force else Terrestrial(*row), itr)
elif view is self._cable_view: elif view is self._cable_view:
self.on_dvb_data_edit(CableDialog, "Provider", view, None if force else Cable(*row), itr) 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: else:
self._app.show_error_message("Not implemented yet!") self._app.show_error_message("Not implemented yet!")
def on_dvb_data_edit(self, dialog, title, view, data=None, edited_itr=None): 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) dialog = dialog(self._app.get_active_window(), title, data)
if dialog.run() == Gtk.ResponseType.OK: if dialog.run() == Gtk.ResponseType.OK:
dvb_data = dialog.data dvb_data = dialog.data
@@ -403,32 +404,31 @@ class SatellitesTool(Gtk.Box):
model.append(dvb_data) model.append(dvb_data)
dialog.destroy() dialog.destroy()
def on_transponder(self, transponder=None, edited_itr=None): def on_transponder_data_edit(self, dialog, title, view, src_view, data=None, edited_itr=None):
""" Create or edit transponder. """ """ Creates or edits transponder data. """
paths = self.check_selection(src_view, "Please, select only one item!")
paths = self.check_selection(self._satellite_view, "Please, select only one satellite!")
if paths is None: if paths is None:
return return
elif len(paths) == 0: elif len(paths) == 0:
self._app.show_error_message("No satellite is selected!") self._app.show_error_message("No source selected!")
return return
dialog = TransponderDialog(self._app.get_active_window(), transponder) dialog = dialog(self._app.app_window, title, data)
tr = dialog.run() if dialog.run() == Gtk.ResponseType.OK:
dialog.destroy() tr = dialog.data
if tr: if tr:
sat_model = self._satellite_view.get_model() src_model = src_view.get_model()
transponders = sat_model[paths][-1] transponders = src_model[paths][-1]
tr_model, tr_paths = self._sat_tr_view.get_selection().get_selected_rows() 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)}) tr_model.set(edited_itr, {i: v for i, v in enumerate(tr)})
transponders[tr_model.get_path(edited_itr).get_indices()[0]] = tr transponders[tr_model.get_path(edited_itr).get_indices()[0]] = tr
else: else:
index = paths[0].get_indices()[0] + 1 index = paths[0].get_indices()[0] + 1
tr_model.insert(index, tr) tr_model.insert(index, tr)
transponders.insert(index, tr) transponders.insert(index, tr)
dialog.destroy()
def check_selection(self, view, message): def check_selection(self, view, message):
""" Checks if any row is selected. Shows error dialog if selected more than one. """ Checks if any row is selected. Shows error dialog if selected more than one.