From 05a6e36589da760805ea5cbdcbf5f19411efc34e Mon Sep 17 00:00:00 2001 From: DYefremov Date: Sat, 6 Jun 2020 09:36:11 +0300 Subject: [PATCH] added update picons dest view --- app/ui/main_app_window.py | 21 +++++++++++++++++---- app/ui/main_helper.py | 11 ++++++++--- app/ui/picons_manager.glade | 7 ++++--- app/ui/picons_manager.py | 37 ++++++++++++++++++++++++++++++------- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index 45838afe..02331f0d 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -26,7 +26,7 @@ from .download_dialog import DownloadDialog from .imports import ImportDialog, import_bouquet from .iptv import IptvDialog, SearchUnavailableDialog, IptvListConfigurationDialog, YtListImportDialog from .main_helper import (insert_marker, move_items, rename, ViewTarget, set_flags, locate_in_services, - scroll_to, get_base_model, update_picons_data, copy_picon_reference, assign_picon, + scroll_to, get_base_model, update_picons_data, copy_picon_reference, assign_picons, remove_picon, is_only_one_item_selected, gen_bouquets, BqGenType, get_iptv_url, append_picons, get_selection, get_model_data, remove_all_unused_picons, get_picon_pixbuf) from .picons_manager import PiconsDialog @@ -165,6 +165,7 @@ class Application(Gtk.Application): # Clearing only after the insertion! self._rows_buffer = [] self._bouquets_buffer = [] + self._picons_buffer = [] self._services = {} self._bouquets = {} self._data_hash = 0 @@ -893,7 +894,8 @@ class Application(Gtk.Application): self.receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=txt) elif len(uris) == 2: from urllib.parse import unquote, urlparse - self.on_assign_picon(view, urlparse(unquote(uris[0])).path, urlparse(unquote(uris[1])).path + "/") + self.picons_buffer = self.on_assign_picon(view, urlparse(unquote(uris[0])).path, + urlparse(unquote(uris[1])).path + "/") def on_bq_view_drag_data_received(self, view, drag_context, x, y, data, info, time): model_name, model = get_model_data(view) @@ -2539,8 +2541,8 @@ class Application(Gtk.Application): append_picons(self._picons, self._services_model) def on_assign_picon(self, view, src_path=None, dst_path=None): - assign_picon(self.get_target_view(view), self._services_view, self._fav_view, self._main_window, - self._picons, self._settings, self._services, src_path, dst_path) + return assign_picons(self.get_target_view(view), self._services_view, self._fav_view, self._main_window, + self._picons, self._settings, self._services, src_path, dst_path) def on_remove_picon(self, view): remove_picon(self.get_target_view(view), self._services_view, self._fav_view, self._picons, self._settings) @@ -2639,6 +2641,17 @@ class Application(Gtk.Application): def current_services(self): return self._services + @property + def picons_buffer(self): + """ Returns a copy and clears the current buffer. """ + buf = list(self._picons_buffer) + self._picons_buffer.clear() + return buf + + @picons_buffer.setter + def picons_buffer(self, value): + self._picons_buffer.extend(value) + def start_app(): try: diff --git a/app/ui/main_helper.py b/app/ui/main_helper.py index 51167e33..0c0144d3 100644 --- a/app/ui/main_helper.py +++ b/app/ui/main_helper.py @@ -367,18 +367,20 @@ def append_picons(picons, model): GLib.idle_add(lambda: next(app, False), priority=GLib.PRIORITY_LOW) -def assign_picon(target, srv_view, fav_view, transient, picons, settings, services, src_path=None, dst_path=None): +def assign_picons(target, srv_view, fav_view, transient, picons, settings, services, src_path=None, dst_path=None): + """ Assigning picons and returns picons files list. """ view = srv_view if target is ViewTarget.SERVICES else fav_view model, paths = view.get_selection().get_selected_rows() + picons_files = [] if not src_path: src_path = get_chooser_dialog(transient, settings, "*.png files", ("*.png",)) if src_path == Gtk.ResponseType.CANCEL: - return + return picons_files if not str(src_path).endswith(".png") or not os.path.isfile(src_path): show_dialog(DialogType.ERROR, transient, text="No png file is selected!") - return + return picons_files p_pos = Column.SRV_PICON col_num = Column.SRV_FAV_ID if target is ViewTarget.SERVICES else Column.FAV_ID @@ -398,6 +400,7 @@ def assign_picon(target, srv_view, fav_view, transient, picons, settings, servic os.makedirs(os.path.dirname(picons_path), exist_ok=True) picon_file = picons_path + picon_id shutil.copy(src_path, picon_file) + picons_files.append(picon_file) picon = get_picon_pixbuf(picon_file) picons[picon_id] = picon model.set_value(itr, p_pos, picon) @@ -406,6 +409,8 @@ def assign_picon(target, srv_view, fav_view, transient, picons, settings, servic else: set_picon(fav_id, get_base_model(srv_view.get_model()), picon, Column.SRV_FAV_ID, p_pos) + return picons_files + def set_picon(fav_id, model, picon, fav_id_pos, picon_pos): for row in model: diff --git a/app/ui/picons_manager.glade b/app/ui/picons_manager.glade index f1c5059a..f6caad91 100644 --- a/app/ui/picons_manager.glade +++ b/app/ui/picons_manager.glade @@ -572,9 +572,10 @@ Author: Dmitriy Yefremov False 1 True - - - + + + + diff --git a/app/ui/picons_manager.py b/app/ui/picons_manager.py index 0371297d..645f5256 100644 --- a/app/ui/picons_manager.py +++ b/app/ui/picons_manager.py @@ -50,9 +50,10 @@ class PiconsDialog: "on_convert": self.on_convert, "on_picons_src_changed": self.on_picons_src_changed, "on_picons_dest_changed": self.on_picons_dest_changed, - "on_picons_view_drag_drop": self.on_picons_view_drag_drop, - "on_picons_view_drag_data_received": self.on_picons_view_drag_data_received, - "on_picons_view_drag_data_get": self.on_picons_view_drag_data_get, + "on_picons_src_view_drag_drop": self.on_picons_src_view_drag_drop, + "on_picons_src_view_drag_data_received": self.on_picons_src_view_drag_data_received, + "on_picons_src_view_drag_data_get": self.on_picons_src_view_drag_data_get, + "on_picons_src_view_drag_end": self.on_picons_src_view_drag_end, "on_picon_info_image_drag_data_received": self.on_picon_info_image_drag_data_received, "on_picons_dest_view_realize": self.on_picons_dest_view_realize, "on_satellites_view_realize": self.on_satellites_view_realize, @@ -235,12 +236,12 @@ class PiconsDialog: self._picon_info_image.drag_dest_set(Gtk.DestDefaults.ALL, [], Gdk.DragAction.COPY) self._picon_info_image.drag_dest_add_uri_targets() - def on_picons_view_drag_drop(self, view, drag_context, x, y, time): + def on_picons_src_view_drag_drop(self, view, drag_context, x, y, time): view.stop_emission_by_name("drag_drop") targets = drag_context.list_targets() view.drag_get_data(drag_context, targets[-1] if targets else Gdk.atom_intern("text/plain", False), time) - def on_picons_view_drag_data_received(self, view, drag_context, x, y, data, info, time): + def on_picons_src_view_drag_data_received(self, view, drag_context, x, y, data, info, time): view.stop_emission_by_name("drag_data_received") txt = data.get_text() if not txt: @@ -267,9 +268,28 @@ class PiconsDialog: c_id = Column.SRV_FAV_ID t_mod = target_view.get_model() - self._app.on_assign_picon(target_view, model[path][-1]) + dest_path = self._explorer_dest_path_button.get_filename() + "/" + self.update_picons_dest_view(self._app.on_assign_picon(target_view, model[path][-1], dest_path)) self.show_assign_info([t_mod.get_value(t_mod.get_iter_from_string(itr), c_id) for itr in itr_str.split(",")]) + @run_idle + def update_picons_dest_view(self, picons): + """ Update destination view on adding/changing picons. """ + if picons: + dest_model = get_base_model(self._picons_dest_view.get_model()) + paths = {r[1]: r.iter for r in dest_model} + + for p_path in picons: + p = self.get_pixbuf_at_scale(p_path, 72, 48, True) + if p: + p_name = Path(p_path).name + itr = paths.get(p_name, None) + if itr: + dest_model.set_value(itr, 0, p) + else: + itr = dest_model.append((p, p_name, p_path)) + scroll_to(dest_model.get_path(itr), self._picons_dest_view) + @run_idle def show_assign_info(self, fav_ids): self._expander.set_expanded(True) @@ -280,12 +300,15 @@ class PiconsDialog: info = self._app.get_hint_for_srv_list(srv) self.append_output("Picon assignment for the service:\n{}\n{}\n".format(info, " * " * 30)) - def on_picons_view_drag_data_get(self, view, drag_context, data, info, time): + def on_picons_src_view_drag_data_get(self, view, drag_context, data, info, time): model, path = view.get_selection().get_selected_rows() if path: data.set_uris([Path(model[path][-1]).as_uri(), Path(self._explorer_dest_path_button.get_filename()).as_uri()]) + def on_picons_src_view_drag_end(self, view, drag_context): + self.update_picons_dest_view(self._app.picons_buffer) + def on_picon_info_image_drag_data_received(self, img, drag_context, x, y, data, info, time): if not self._current_picon_info: self.show_info_message("No selected item!", Gtk.MessageType.ERROR)