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)