From 1eeccd654af4832fc5764a59b2f38df9225a1690 Mon Sep 17 00:00:00 2001 From: DYefremov Date: Sun, 18 Mar 2018 18:11:16 +0300 Subject: [PATCH] added validation for non empty entries in service dialog --- app/ui/service_details_dialog.glade | 10 ++-- app/ui/service_details_dialog.py | 79 ++++++++++++++++++----------- 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/app/ui/service_details_dialog.glade b/app/ui/service_details_dialog.glade index 63e9ec36..f0730ae2 100644 --- a/app/ui/service_details_dialog.glade +++ b/app/ui/service_details_dialog.glade @@ -372,7 +372,7 @@ 10 10 gtk-edit - + 2 @@ -997,7 +997,7 @@ 12 12 gtk-edit - + 1 @@ -1023,7 +1023,7 @@ 12 12 gtk-edit - + 2 @@ -1232,7 +1232,7 @@ 8 10 gtk-edit - + 0 @@ -1258,7 +1258,7 @@ 8 10 gtk-edit - + 1 diff --git a/app/ui/service_details_dialog.py b/app/ui/service_details_dialog.py index 7112bb15..34c8368d 100644 --- a/app/ui/service_details_dialog.py +++ b/app/ui/service_details_dialog.py @@ -21,11 +21,11 @@ class ServiceDetailsDialog: _NEUTRINO_TRANSPONDER_DATA = "{:04x}:{:04x}:{}:{}:{}:{}:{}:{}:{}" - _DIGIT_ENTRY_ELEMENTS = ("sid_entry", "bitstream_entry", "pcm_entry", "video_pid_entry", "pcr_pid_entry", - "audio_pid_entry", "ac3_pid_entry", "ac3plus_pid_entry", "acc_pid_entry", "freq_entry", - "he_acc_pid_entry", "teletext_pid_entry", "transponder_id_entry", "network_id_entry", - "rate_entry", "pls_code_entry", "stream_id_entry", "tr_flag_entry", "namespace_entry", - "srv_type_entry") + _DIGIT_ENTRY_ELEMENTS = ("bitstream_entry", "pcm_entry", "video_pid_entry", "pcr_pid_entry", "srv_type_entry", + "ac3_pid_entry", "ac3plus_pid_entry", "acc_pid_entry", "he_acc_pid_entry", + "teletext_pid_entry", "pls_code_entry", "stream_id_entry", "tr_flag_entry", + "audio_pid_entry", "namespace_entry") + _NOT_EMPTY_DIGIT_ELEMENTS = ("sid_entry", "freq_entry", "rate_entry", "transponder_id_entry", "network_id_entry") _DIGIT_ENTRY_NAME = "digit-entry" @@ -34,7 +34,8 @@ class ServiceDetailsDialog: "on_save": self.on_save, "on_create_new": self.on_create_new, "on_digit_entry_changed": self.on_digit_entry_changed, - "on_tr_edit_toggled": self.on_tr_edit_toggled} + "on_tr_edit_toggled": self.on_tr_edit_toggled, + "on_non_empty_entry_changed": self.on_non_empty_entry_changed} builder = Gtk.Builder() builder.set_translation_domain(TEXT_DOMAIN) @@ -53,18 +54,24 @@ class ServiceDetailsDialog: self._transponder_services_iters = None self._current_model = None self._current_itr = None - self._pattern = re.compile("\D") + self._DIGIT_PATTERN = re.compile("\D") + self._NON_EMPTY_PATTERN = re.compile("(?:^[\s]*$|\D)") self._apply_button = builder.get_object("apply_button") self._create_button = builder.get_object("create_button") # style self._style_provider = Gtk.CssProvider() self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css") - # initialize only digit elements + # initialization only digit elements self._digit_elements = {k: builder.get_object(k) for k in self._DIGIT_ENTRY_ELEMENTS} for elem in self._digit_elements.values(): elem.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) - self._sid_entry = self._digit_elements.get("sid_entry") + # initialization of non empty elements + self._non_empty_elements = {k: builder.get_object(k) for k in self._NOT_EMPTY_DIGIT_ELEMENTS} + for elem in self._non_empty_elements.values(): + elem.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider, + Gtk.STYLE_PROVIDER_PRIORITY_USER) + self._sid_entry = self._non_empty_elements.get("sid_entry") self._bitstream_entry = self._digit_elements.get("bitstream_entry") self._pcm_entry = self._digit_elements.get("pcm_entry") self._video_pid_entry = self._digit_elements.get("video_pid_entry") @@ -75,10 +82,10 @@ class ServiceDetailsDialog: self._acc_pid_entry = self._digit_elements.get("acc_pid_entry") self._he_acc_pid_entry = self._digit_elements.get("he_acc_pid_entry") self._teletext_pid_entry = self._digit_elements.get("teletext_pid_entry") - self._transponder_id_entry = self._digit_elements.get("transponder_id_entry") - self._network_id_entry = self._digit_elements.get("network_id_entry") - self._freq_entry = self._digit_elements.get("freq_entry") - self._rate_entry = self._digit_elements.get("rate_entry") + self._transponder_id_entry = self._non_empty_elements.get("transponder_id_entry") + self._network_id_entry = self._non_empty_elements.get("network_id_entry") + self._freq_entry = self._non_empty_elements.get("freq_entry") + self._rate_entry = self._non_empty_elements.get("rate_entry") self._pls_code_entry = self._digit_elements.get("pls_code_entry") self._stream_id_entry = self._digit_elements.get("stream_id_entry") self._tr_flag_entry = self._digit_elements.get("tr_flag_entry") @@ -286,6 +293,12 @@ class ServiceDetailsDialog: # ***************** Save data *********************# def on_save(self, item): + self.save_data() + + def on_create_new(self, item): + self.save_data() + + def save_data(self): if not self.is_data_correct(): show_dialog(DialogType.ERROR, self._dialog, "Error. Verify the data!") return @@ -293,6 +306,10 @@ 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() + + def on_edit(self): fav_id, data_id = self.get_srv_data() # transponder transponder = self._old_service.transponder @@ -300,9 +317,7 @@ class ServiceDetailsDialog: transponder = self.get_transponder_data() if self._transponder_services_iters: self.update_transponder_services(transponder) - service = self.get_service(fav_id, data_id, transponder) - old_fav_id = self._old_service.fav_id if old_fav_id != fav_id: self._services.pop(old_fav_id, None) @@ -313,24 +328,13 @@ class ServiceDetailsDialog: indexes.append(i) for i in indexes: bq[i] = fav_id - self._services[fav_id] = service self._current_model.set(self._current_itr, {i: v for i, v in enumerate(service)}) self._old_service = service - def update_transponder_services(self, transponder): - for itr in self._transponder_services_iters: - srv = self._current_model[itr][:] - srv[-9], srv[-8], srv[-7], srv[-6], srv[-5], srv[-4] = self.get_transponder_values() - srv[-1] = 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)}) - - def on_create_new(self, item): - if show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL: - return - + def on_new(self): + service = self.get_service(*self.get_srv_data(), self.get_transponder_data()) + print(service) show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!") def get_service(self, fav_id, data_id, transponder): @@ -454,6 +458,15 @@ class ServiceDetailsDialog: srv_sys = None return self._NEUTRINO_TRANSPONDER_DATA.format(tr_id, on_id, freq, inv, rate, fec, pol, mod, srv_sys) + def update_transponder_services(self, transponder): + for itr in self._transponder_services_iters: + srv = self._current_model[itr][:] + srv[-9], srv[-8], srv[-7], srv[-6], srv[-5], srv[-4] = self.get_transponder_values() + srv[-1] = 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)}) + # ***************** Others *********************# def select_active_text(self, box: Gtk.ComboBox, text): @@ -464,7 +477,10 @@ class ServiceDetailsDialog: break def on_digit_entry_changed(self, entry): - entry.set_name(self._DIGIT_ENTRY_NAME if self._pattern.search(entry.get_text()) else "GtkEntry") + entry.set_name(self._DIGIT_ENTRY_NAME if self._DIGIT_PATTERN.search(entry.get_text()) else "GtkEntry") + + def on_non_empty_entry_changed(self, entry): + entry.set_name(self._DIGIT_ENTRY_NAME if self._NON_EMPTY_PATTERN.search(entry.get_text()) else "GtkEntry") def get_value_from_combobox_id(self, box: Gtk.ComboBox, dc: dict): cb_id = box.get_active_id() @@ -493,6 +509,9 @@ class ServiceDetailsDialog: for elem in self._digit_elements.values(): if elem.get_name() == self._DIGIT_ENTRY_NAME: return False + for elem in self._non_empty_elements.values(): + if elem.get_name() == self._DIGIT_ENTRY_NAME: + return False return True