added update picons dest view

This commit is contained in:
DYefremov
2020-06-06 09:36:11 +03:00
parent 50a5cf6fc3
commit 05a6e36589
4 changed files with 59 additions and 17 deletions

View File

@@ -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:

View File

@@ -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:

View File

@@ -572,9 +572,10 @@ Author: Dmitriy Yefremov
<property name="headers_visible">False</property>
<property name="tooltip_column">1</property>
<property name="activate_on_single_click">True</property>
<signal name="drag-data-get" handler="on_picons_view_drag_data_get" swapped="no"/>
<signal name="drag-data-received" handler="on_picons_view_drag_data_received" swapped="no"/>
<signal name="drag-drop" handler="on_picons_view_drag_drop" swapped="no"/>
<signal name="drag-data-get" handler="on_picons_src_view_drag_data_get" swapped="no"/>
<signal name="drag-data-received" handler="on_picons_src_view_drag_data_received" swapped="no"/>
<signal name="drag-drop" handler="on_picons_src_view_drag_drop" swapped="no"/>
<signal name="drag-end" handler="on_picons_src_view_drag_end" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="picons_src_view_selection"/>
</child>

View File

@@ -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)