From 329513d2a7441e870fb8beba20b642a630ea6482 Mon Sep 17 00:00:00 2001 From: DYefremov Date: Sun, 21 Apr 2019 01:18:54 +0300 Subject: [PATCH] epg config dialog skeleton --- app/ui/epg_dialog.glade | 199 ++++++++++++++++++++++++++------------ app/ui/epg_dialog.py | 62 +++++++++++- app/ui/main_app_window.py | 9 +- 3 files changed, 203 insertions(+), 67 deletions(-) diff --git a/app/ui/epg_dialog.glade b/app/ui/epg_dialog.glade index da4d2a12..de0c5195 100644 --- a/app/ui/epg_dialog.glade +++ b/app/ui/epg_dialog.glade @@ -59,6 +59,12 @@ Author: Dmitriy Yefremov + + bouquet_list_store + + + bouquet_filter_model + @@ -67,17 +73,30 @@ Author: Dmitriy Yefremov + + services_list_store + + + services_filter_model + + 480 + 320 False + True center-on-parent 480 240 + True + gtk-index + True center True False - EPG Tool + EPG + List configuration 2 True @@ -86,13 +105,14 @@ Author: Dmitriy Yefremov False 2 - + True True True Apply + - + True False gtk-apply @@ -109,8 +129,6 @@ Author: Dmitriy Yefremov True False - 5 - 5 False @@ -119,32 +137,19 @@ Author: Dmitriy Yefremov - - lamedb + True True - False - Channel names source - True - True - radiobutton1 - - - False - True - 2 - - - - - xml - True - True - False - Channel names source - True - True - radiobutton2 + True + Save to xml + + + + True + False + gtk-save-as + + False @@ -152,33 +157,75 @@ Author: Dmitriy Yefremov 3 + + + + + True + False + 2 - + True - False - Select xml file - + True + True + Auto configuration by service names. + + + + True + False + gtk-find-and-replace + + False True - 4 + 0 - - - - - True - True - True - Save to xml - + True - False - gtk-save-as + True + True + Filter + + + + True + False + gtk-spell-check + + + + False + True + 1 + + + + + True + True + True + + + + True + False + Options + gtk-properties + + + + + False + True + 2 + @@ -194,33 +241,34 @@ Author: Dmitriy Yefremov False vertical - + True False - True - + True True tools-check-spelling False False + False True - 0 + 1 - + True True True + 240 True False vertical @@ -230,7 +278,7 @@ Author: Dmitriy Yefremov False 2 2 - Source + EPG source @@ -250,21 +298,41 @@ Author: Dmitriy Yefremov True True - services_list_store + service_sort_model + 0 + both + True + autosize + 10 Service + True + 0 - + + 5 + 0 + + + + + True + autosize + 10 + Reference + True - + + 0.50999999046325684 + 1 @@ -288,6 +356,7 @@ Author: Dmitriy Yefremov + 240 True False vertical @@ -317,7 +386,7 @@ Author: Dmitriy Yefremov True True - bouquet_list_store + bouquet_sort_model 2 True both @@ -330,8 +399,9 @@ Author: Dmitriy Yefremov True - 25 + 10 Num + 0 0.20000000298023224 @@ -348,9 +418,10 @@ Author: Dmitriy Yefremov True - 50 + autosize + 10 Service - True + 2 2 @@ -402,9 +473,9 @@ Author: Dmitriy Yefremov True - 25 + autosize + 10 Type - True 0.50999999046325684 @@ -418,9 +489,11 @@ Author: Dmitriy Yefremov - 25 + False + True + autosize + 10 Pos - True 0.50999999046325684 @@ -435,6 +508,7 @@ Author: Dmitriy Yefremov False + autosize fav_id @@ -447,6 +521,7 @@ Author: Dmitriy Yefremov False + autosize extra diff --git a/app/ui/epg_dialog.py b/app/ui/epg_dialog.py index d081ae58..35188b20 100644 --- a/app/ui/epg_dialog.py +++ b/app/ui/epg_dialog.py @@ -1,19 +1,26 @@ from app.commons import run_idle from app.tools.epg import EPG from .main_helper import on_popup_menu -from .uicommons import Gtk, UI_RESOURCES_PATH, TEXT_DOMAIN +from .uicommons import Gtk, UI_RESOURCES_PATH, TEXT_DOMAIN, Column, EPG_ICON class EpgDialog: - def __init__(self, transient, options, services, fav_model): + def __init__(self, transient, options, services, bouquet, fav_model): - handlers = {"on_info_bar_close": self.on_info_bar_close, + handlers = {"on_apply": self.on_apply, + "on_save_to_xml": self.on_save_to_xml, + "on_options": self.on_options, + "on_auto_configuration": self.on_auto_configuration, + "on_filter_toggled": self.on_filter_toggled, + "on_filter_changed": self.on_filter_changed, + "on_info_bar_close": self.on_info_bar_close, "on_popup_menu": on_popup_menu} self._services = services self._ex_fav_model = fav_model self._options = options + self._bouquet = bouquet builder = Gtk.Builder() builder.set_translation_domain(TEXT_DOMAIN) @@ -26,13 +33,21 @@ class EpgDialog: self._services_model = builder.get_object("services_list_store") self._info_bar = builder.get_object("info_bar") self._message_label = builder.get_object("info_bar_message_label") + # Filter + self._filter_bar = builder.get_object("filter_bar") + self._filter_entry = builder.get_object("filter_entry") + self._services_filter_model = builder.get_object("services_filter_model") + self._bouquet_filter_model = builder.get_object("bouquet_filter_model") + self._services_filter_model.set_visible_func(self.services_filter_function) + self._bouquet_filter_model.set_visible_func(self.bouquet_filter_function) self.init_data() @run_idle def init_data(self): for r in self._ex_fav_model: - self._bouquet_model.append(r[:]) + row = [*r[:]] + self._bouquet_model.append(row) try: refs = EPG.get_epg_refs(self._options.get("data_dir_path", "") + "epg.dat") @@ -53,6 +68,45 @@ class EpgDialog: def show(self): self._dialog.show() + def on_apply(self, item): + self._bouquet.clear() + list(map(self._bouquet.append, [r[Column.FAV_ID] for r in self._bouquet_model])) + + def on_save_to_xml(self, item): + pass + + def on_options(self, item): + pass + + def on_auto_configuration(self, item): + source = {r[0]: r[1] for r in self._services_model} + success_count = 0 + + for r in self._bouquet_filter_model: + ref = source.get(r[Column.FAV_SERVICE], None) + if ref: + r[Column.FAV_LOCKED] = EPG_ICON + print("Found for {}".format(r[Column.FAV_SERVICE])) + success_count += 1 + + self.show_info_message("Done! Count of successfully configured services: {}".format(success_count), + Gtk.MessageType.INFO) + + def on_filter_toggled(self, button: Gtk.ToggleButton): + self._filter_bar.set_search_mode(button.get_active()) + + def on_filter_changed(self, entry): + self._bouquet_filter_model.refilter() + self._services_filter_model.refilter() + + def bouquet_filter_function(self, model, itr, data): + txt = self._filter_entry.get_text().upper() + return model is None or model == "None" or txt in model.get_value(itr, Column.FAV_SERVICE).upper() + + def services_filter_function(self, model, itr, data): + txt = self._filter_entry.get_text().upper() + return model is None or model == "None" or txt in model.get_value(itr, 0).upper() + def on_info_bar_close(self, bar=None, resp=None): self._info_bar.set_visible(False) diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index af1ceb14..707ec628 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -1346,11 +1346,18 @@ class Application(Gtk.Application): # ****************** EPG **********************# + @run_idle def on_epg_list_configuration(self, item): if Profile(self._profile) is not Profile.ENIGMA_2: self.show_error_dialog("Only Enigma2 is supported!") return - EpgDialog(self._main_window, self._options.get(self._profile), self._services, self._fav_model).show() + + if not any(r[Column.FAV_TYPE] == BqServiceType.IPTV.value for r in self._fav_model): + self.show_error_dialog("This list does not contains IPTV streams!") + return + + bq = self._bouquets.get(self._bq_selected) + EpgDialog(self._main_window, self._options.get(self._profile), self._services, bq, self._fav_model).show() # ***************** Import ********************#