optimisation of data load/save

This commit is contained in:
DYefremov
2019-08-01 01:05:30 +03:00
parent fdd30b2ac9
commit e382a51f81
2 changed files with 66 additions and 27 deletions

View File

@@ -219,6 +219,8 @@ class Application(Gtk.Application):
self._tv_count_label = builder.get_object("tv_count_label")
self._radio_count_label = builder.get_object("radio_count_label")
self._data_count_label = builder.get_object("data_count_label")
self._save_header_button = builder.get_object("save_header_button")
self._save_header_button.bind_property("sensitive", builder.get_object("save_menu_button"), "sensitive")
# Force ctrl press event for view. Multiple selections in lists only with Space key(as in file managers)!!!
self._services_view.connect("key-press-event", self.force_ctrl)
self._fav_view.connect("key-press-event", self.force_ctrl)
@@ -822,7 +824,6 @@ class Application(Gtk.Application):
except Exception as e:
self.show_error_dialog(str(e))
@run_idle
def on_data_open(self, model):
response = show_dialog(DialogType.CHOOSER, self._main_window, options=self._options.get(self._profile))
if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT):
@@ -831,35 +832,49 @@ class Application(Gtk.Application):
def open_data(self, data_path=None):
""" Opening data and fill views. """
self._wait_dialog.show()
self.clear_current_data()
GLib.idle_add(self.append_data, data_path, priority=GLib.PRIORITY_LOW)
gen = self.append_data(data_path)
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
def append_data(self, data_path):
self._wait_dialog.show()
yield True
profile = Profile(self._profile)
data_path = self._options.get(self._profile).get("data_dir_path") if data_path is None else data_path
c_gen = self.clear_current_data()
yield from c_gen
try:
black_list = get_blacklist(data_path)
bouquets = get_bouquets(data_path, Profile(self._profile))
yield True
services = get_services(data_path, profile, self.get_format_version() if profile is Profile.ENIGMA_2 else 0)
yield True
update_picons_data(self._options.get(self._profile).get("picons_dir_path"), self._picons)
yield True
except FileNotFoundError as e:
self._wait_dialog.hide()
msg = get_message("Please, download files from receiver or setup your path for read data!")
self.show_error_dialog(getattr(e, "message", str(e)) + "\n\n" + msg)
return
except SyntaxError as e:
self._wait_dialog.hide()
self.show_error_dialog(str(e))
return
except Exception as e:
self._wait_dialog.hide()
log("Append services error: " + str(e))
self.show_error_dialog(get_message("Reading data error!") + "\n" + str(e))
return
else:
self.append_blacklist(black_list)
self.append_bouquets(bouquets)
self.append_services(services)
yield True
s_gen = self.append_services(services)
yield from s_gen
self.update_sat_positions()
yield True
finally:
self._wait_dialog.hide()
yield True
def append_blacklist(self, black_list):
if black_list:
@@ -915,10 +930,7 @@ class Application(Gtk.Application):
# adding channels to dict with fav_id as keys
self._services[srv.fav_id] = srv
self.update_services_counts(len(self._services.values()))
gen = self.append_services_data(services)
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
def append_services_data(self, services):
for srv in services:
tooltip, background = None, None
if self._use_colors:
@@ -932,13 +944,22 @@ class Application(Gtk.Application):
itr = self._services_model.append(s)
self._services_model.set_value(itr, Column.SRV_PICON, self._picons.get(srv.picon_id, None))
yield True
self._wait_dialog.hide()
def clear_current_data(self):
""" Clearing current data from lists """
self._bouquets_model.clear()
yield True
self._fav_model.clear()
self._services_model.clear()
yield True
s_model = self._services_view.get_model()
self._services_view.set_model(None)
yield True
for index, itr in enumerate([row.iter for row in self._services_model]):
self._services_model.remove(itr)
if index % 50 == 0:
yield True
yield True
self._services_view.set_model(s_model)
self._blacklist.clear()
self._services.clear()
self._rows_buffer.clear()
@@ -947,8 +968,8 @@ class Application(Gtk.Application):
self._current_bq_name = None
self._bq_name_label.set_text("")
self.init_sat_positions()
yield True
@run_idle
def on_data_save(self, *args):
if len(self._bouquets_model) == 0:
self.show_error_dialog("No data to save!")
@@ -957,12 +978,18 @@ class Application(Gtk.Application):
if show_dialog(DialogType.QUESTION, self._main_window) == Gtk.ResponseType.CANCEL:
return
gen = self.save_data()
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
def save_data(self):
self._save_header_button.set_sensitive(False)
profile = Profile(self._profile)
options = self._options.get(self._profile)
path = options.get("data_dir_path")
backup_path = options.get("backup_dir_path", path + "backup/")
# Backup data or clearing data path
backup_data(path, backup_path) if options.get("backup_before_save", True) else clear_data_path(path)
yield True
bouquets = []
@@ -986,27 +1013,35 @@ class Application(Gtk.Application):
if len(b_path) == 1:
bouquets.append(Bouquets(*model.get(itr, Column.BQ_NAME, Column.BQ_TYPE), bqs if bqs else []))
profile = Profile(self._profile)
# Getting bouquets
self._bouquets_view.get_model().foreach(parse_bouquets)
write_bouquets(path, bouquets, profile)
yield True
# Getting services
services_model = get_base_model(self._services_view.get_model())
services = [Service(*row[: Column.SRV_TOOLTIP]) for row in services_model]
write_services(path, services, profile, self.get_format_version() if profile is Profile.ENIGMA_2 else 0)
yield True
# removing bouquet files
if profile is Profile.ENIGMA_2:
# blacklist
write_blacklist(path, self._blacklist)
self._save_header_button.set_sensitive(True)
yield True
def on_new_configuration(self, item):
""" Creates new empty configuration """
if show_dialog(DialogType.QUESTION, self._main_window) == Gtk.ResponseType.CANCEL:
return
self.clear_current_data()
gen = self.create_new_configuration(Profile(self._profile))
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
def create_new_configuration(self, profile):
c_gen = self.clear_current_data()
yield from c_gen
profile = Profile(self._profile)
if profile is Profile.ENIGMA_2:
parent = self._bouquets_model.append(None, ["Favourites (TV)", None, None, BqType.TV.value])
self.append_bouquet(Bouquet("Favourites (TV)", BqType.TV.value, [], None, None), parent)
@@ -1016,6 +1051,7 @@ class Application(Gtk.Application):
self._bouquets_model.append(None, ["Providers", None, None, BqType.BOUQUET.value])
self._bouquets_model.append(None, ["FAV", None, None, BqType.TV.value])
self._bouquets_model.append(None, ["WEBTV", None, None, BqType.WEBTV.value])
yield True
def on_services_selection(self, model, path, column):
self.update_service_bar(model, path)
@@ -1104,22 +1140,25 @@ class Application(Gtk.Application):
for v in [view, *args]:
v.get_selection().unselect_all()
@run_idle
def on_preferences(self, item):
response = show_settings_dialog(self._main_window, self._options)
if response != Gtk.ResponseType.CANCEL:
self.update_options()
gen = self.update_options()
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
def update_options(self):
profile = self._options.get("profile")
self._ip_label.set_text(self._options.get(profile).get("host"))
if profile != self._profile:
self._profile = profile
self.clear_current_data()
c_gen = self.clear_current_data()
yield from c_gen
self.update_services_counts()
self.update_profile_label()
self.init_colors(True)
yield True
self.init_http_api()
yield True
def on_tree_view_key_press(self, view, event):
""" Handling keystrokes on press """
@@ -1181,8 +1220,6 @@ class Application(Gtk.Application):
self.on_new_bouquet(view)
elif ctrl and key is KeyboardKey.BACK_SPACE and model_name == self._SERVICE_LIST_NAME:
self.on_to_fav_end_copy(view)
elif ctrl and key is KeyboardKey.S:
self.on_data_save()
elif ctrl and key is KeyboardKey.L:
self.on_locked(None)
elif ctrl and key is KeyboardKey.H:

View File

@@ -399,7 +399,7 @@ Author: Dmitriy Yefremov
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkModelButton" id="import_munu_button">
<object class="GtkModelButton" id="import_menu_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -413,7 +413,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkModelButton" id="create_munu_button">
<object class="GtkModelButton" id="create_menu_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -438,7 +438,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkModelButton" id="open_munu_button">
<object class="GtkModelButton" id="open_menu_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -452,12 +452,13 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkModelButton" id="save_munu_button">
<object class="GtkModelButton" id="save_menu_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="text" translatable="yes">Save</property>
<signal name="clicked" handler="on_data_save" swapped="no"/>
<accelerator key="s" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
</object>
<packing>
<property name="expand">False</property>
@@ -478,7 +479,7 @@ Author: Dmitriy Yefremov
</packing>
</child>
<child>
<object class="GtkModelButton" id="transfer_munu_button">
<object class="GtkModelButton" id="transfer_menu_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -1036,6 +1037,7 @@ Author: Dmitriy Yefremov
<property name="stock">gtk-save</property>
</object>
</child>
<accelerator key="s" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
</object>
<packing>
<property name="expand">False</property>