diff --git a/app/ui/service_details_dialog.glade b/app/ui/service_details_dialog.glade index 82dc802e..b248f9bc 100644 --- a/app/ui/service_details_dialog.glade +++ b/app/ui/service_details_dialog.glade @@ -295,6 +295,7 @@ Author: Dmitriy Yefremov True True center + True @@ -1599,9 +1600,6 @@ Author: Dmitriy Yefremov - - cancel_button - diff --git a/app/ui/service_details_dialog.py b/app/ui/service_details_dialog.py index 7e8805e7..dbd212c7 100644 --- a/app/ui/service_details_dialog.py +++ b/app/ui/service_details_dialog.py @@ -43,7 +43,8 @@ class ServiceDetailsDialog: "update_reference": self.update_reference, "on_cas_entry_changed": self.on_cas_entry_changed, "on_digit_entry_changed": self.on_digit_entry_changed, - "on_non_empty_entry_changed": self.on_non_empty_entry_changed} + "on_non_empty_entry_changed": self.on_non_empty_entry_changed, + "on_cancel": lambda item: self._dialog.destroy()} builder = Gtk.Builder() builder.set_translation_domain(TEXT_DOMAIN) @@ -54,7 +55,7 @@ class ServiceDetailsDialog: self._dialog = builder.get_object("service_details_dialog") self._dialog.set_transient_for(transient) self._s_type = settings.setting_type - self._tr_type = None + self._tr_type = TrType.Satellite self._satellites_xml_path = settings.data_local_path + "satellites.xml" self._picons_dir_path = settings.picons_local_path self._services_view = srv_view @@ -146,12 +147,7 @@ class ServiceDetailsDialog: self.init_default_data_elements() def show(self): - response = self._dialog.run() - if response == Gtk.ResponseType.OK: - pass - self._dialog.destroy() - - return response + self._dialog.show() @run_idle def init_default_data_elements(self): @@ -378,13 +374,14 @@ class ServiceDetailsDialog: if show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL: return - self.on_edit() if self._action is Action.EDIT else self.on_new() - self._dialog.destroy() + if self.on_edit() if self._action is Action.EDIT else self.on_new(): + self._dialog.destroy() def on_new(self): """ Create new service. """ service = self.get_service(*self.get_srv_data(), self.get_satellite_transponder_data()) show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!") + return True def on_edit(self): """ Edit current service. """ @@ -404,12 +401,17 @@ class ServiceDetailsDialog: show_dialog(DialogType.ERROR, transient=self._dialog, text="Error getting transponder parameters!") else: if self._transponder_services_iters: - self.update_transponder_services(transponder) + self.update_transponder_services(transponder, self.get_sat_position()) # Service service = self.get_service(fav_id, data_id, transponder) old_fav_id = self._old_service.fav_id if old_fav_id != fav_id: + if fav_id in self._services: + msg = "{}\n\n\t{}".format("A similar service is already in this list!", "Are you sure?") + if show_dialog(DialogType.QUESTION, transient=self._dialog, text=msg) != Gtk.ResponseType.OK: + return False self.update_bouquets(fav_id, old_fav_id) + self._services[fav_id] = service if self._old_service.picon_id != service.picon_id: @@ -417,7 +419,7 @@ class ServiceDetailsDialog: flags = service.flags_cas extra_data = {Column.SRV_TOOLTIP: None, Column.SRV_BACKGROUND: None} - if flags: + if self._s_type is SettingsType.ENIGMA_2 and flags: f_flags = list(filter(lambda x: x.startswith("f:"), flags.split(","))) if f_flags and Flag.is_new(int(f_flags[0][2:])): extra_data[Column.SRV_BACKGROUND] = self._new_color @@ -426,6 +428,7 @@ class ServiceDetailsDialog: self._current_model.set(self._current_itr, {i: v for i, v in enumerate(service)}) self.update_fav_view(self._old_service, service) self._old_service = service + return True def update_bouquets(self, fav_id, old_fav_id): self._services.pop(old_fav_id, None) @@ -493,7 +496,9 @@ class ServiceDetailsDialog: if self._s_type is SettingsType.ENIGMA_2: return self.get_enigma2_flags() elif self._s_type is SettingsType.NEUTRINO_MP: - return self._old_service.flags_cas + flags = self._old_service.flags_cas.split(":") + flags[1] = self.get_sat_position() + return ":".join(flags) def get_enigma2_flags(self): flags = ["p:{}".format(self._package_entry.get_text())] @@ -545,7 +550,9 @@ class ServiceDetailsDialog: return fav_id, data_id elif self._s_type is SettingsType.NEUTRINO_MP: fav_id = self._NEUTRINO_FAV_ID.format(tr_id, net_id, ssid) - return fav_id, self._old_service.data_id + data_id = self._old_service.data_id.split(":") + data_id[1] = "{:x}".format(int(service_type)) + return fav_id, ":".join(data_id) # ***************** Transponder ********************* # @@ -573,8 +580,7 @@ class ServiceDetailsDialog: rate = "{}000".format(self._rate_entry.get_text()) pol = self.get_value_from_combobox_id(self._pol_combo_box, POLARIZATION) fec = self.get_value_from_combobox_id(self._fec_combo_box, FEC_DEFAULT) - sat_pos = self._sat_pos_button.get_value() * (-1 if self._pos_side_box.get_active_id() == "W" else 1) - sat_pos = str(round(sat_pos, 1)).replace(".", "") + sat_pos = self.get_sat_position() inv = get_value_by_name(Inversion, self._invertion_combo_box.get_active_id()) srv_sys = "0" # !!! @@ -599,6 +605,11 @@ class ServiceDetailsDialog: srv_sys = None return self._NEUTRINO_TRANSPONDER_DATA.format(tr_id, on_id, freq, inv, rate, fec, pol, mod, srv_sys) + def get_sat_position(self): + sat_pos = self._sat_pos_button.get_value() * (-1 if self._pos_side_box.get_active_id() == "W" else 1) + sat_pos = str(round(sat_pos, 1)).replace(".", "") + return sat_pos + def get_terrestrial_transponder_data(self): tr_data = re.split("\s|:", self._old_service.transponder) # frequency, bandwidth, code rate HP, code rate LP, modulation, transmission mode, guard interval, hierarchy, @@ -627,15 +638,26 @@ class ServiceDetailsDialog: tr_data[6] = get_value_by_name(SystemCable, self._sys_combo_box.get_active_id()) return "{} {}".format(tr_data[0], ":".join(tr_data[1:])) - def update_transponder_services(self, transponder): + def update_transponder_services(self, transponder, sat_pos): for itr in self._transponder_services_iters: - srv = self._current_model[itr][:Column.SRV_TOOLTIP] + srv = self._current_model[itr][:] srv[Column.SRV_FREQ], srv[Column.SRV_RATE], srv[Column.SRV_POL], srv[Column.SRV_FEC], srv[ Column.SRV_SYSTEM], srv[Column.SRV_POS] = self.get_transponder_values() srv[Column.SRV_TRANSPONDER] = transponder - srv = Service(*srv) - self._services[srv.fav_id] = self._services.pop(srv.fav_id)._replace(transponder=transponder) - self._current_model.set(itr, {i: v for i, v in enumerate(srv)}) + + fav_id = srv[Column.SRV_FAV_ID] + old_srv = self._services.pop(fav_id, None) + if not old_srv: + log("Update transponder services error: No service found for ID {}".format(srv[Column.SRV_FAV_ID])) + continue + + if self._s_type is SettingsType.NEUTRINO_MP: + flags = srv[Column.SRV_CAS_FLAGS].split(":") + flags[1] = sat_pos + srv[Column.SRV_CAS_FLAGS] = ":".join(flags) + + self._services[fav_id] = Service(*srv[:Column.SRV_TOOLTIP]) + self._current_model.set_row(itr, srv) # ***************** Others *********************# @@ -664,10 +686,10 @@ class ServiceDetailsDialog: if active and self._action is Action.EDIT: self._transponder_services_iters = [] response = TransponderServicesDialog(self._dialog, - self._current_model, + self._services_view, self._old_service.transponder, self._transponder_services_iters).show() - if response == Gtk.ResponseType.CANCEL or response == -4: + if response == Gtk.ResponseType.CANCEL or response == Gtk.ResponseType.DELETE_EVENT: switch.set_active(False) self._transponder_services_iters = None return @@ -821,7 +843,7 @@ class ServiceDetailsDialog: class TransponderServicesDialog: - def __init__(self, transient, model, transponder, tr_iters): + def __init__(self, transient, services_view, transponder, tr_iters): builder = Gtk.Builder() builder.set_translation_domain(TEXT_DOMAIN) builder.add_objects_from_string(get_dialogs_string(_UI_PATH).format(use_header=IS_GNOME_SESSION), @@ -829,15 +851,18 @@ class TransponderServicesDialog: self._dialog = builder.get_object("tr_services_dialog") self._dialog.set_transient_for(transient) self._srv_model = builder.get_object("transponder_services_liststore") - self.append_services(model, transponder, tr_iters) + self.append_services(services_view, transponder, tr_iters) builder.get_object("srv_list_dialog_info_bar").connect("response", lambda bar, resp: bar.hide()) - def append_services(self, model, transponder, tr_iters): + def append_services(self, view, transponder, tr_iters): + model = view.get_model() + filter_model = model.get_model() for row in model: if row[Column.SRV_TRANSPONDER] == transponder: self._srv_model.append((row[Column.SRV_SERVICE], row[Column.SRV_PACKAGE], row[Column.SRV_TYPE], row[Column.SRV_SSID], row[Column.SRV_FREQ], row[Column.SRV_POS])) - tr_iters.append(model.get_iter(row.path)) + itr = model.get_iter(row.path) + tr_iters.append(filter_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr))) def show(self): response = self._dialog.run()