mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-01-14 19:43:05 +01:00
improved reference assignment for IPTV
This commit is contained in:
@@ -1116,6 +1116,7 @@ Author: Dmitriy Yefremov
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">bouquet_list_store</property>
|
||||
<property name="search_column">2</property>
|
||||
<property name="rubber_banding">True</property>
|
||||
<property name="enable_grid_lines">both</property>
|
||||
<property name="tooltip_column">9</property>
|
||||
<signal name="button-press-event" handler="on_bouquet_popup_menu" object="bouquet_popup_menu" swapped="no"/>
|
||||
@@ -1123,7 +1124,7 @@ Author: Dmitriy Yefremov
|
||||
<signal name="drag-data-received" handler="on_drag_data_received" swapped="no"/>
|
||||
<signal name="key-release-event" handler="on_key_press" swapped="no"/>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection">
|
||||
<object class="GtkTreeSelection" id="bouquet_view_selection">
|
||||
<property name="mode">multiple</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
@@ -706,6 +706,10 @@ class EpgDialog:
|
||||
get_message("Count of successfully configured services:"),
|
||||
success_count), Gtk.MessageType.INFO)
|
||||
|
||||
def assign_refs(self, model, paths, data):
|
||||
[self.assign_data(model[p], data) for p in paths]
|
||||
self.update_epg_count()
|
||||
|
||||
def assign_data(self, row, data, show_error=False):
|
||||
if row[Column.FAV_TYPE] != BqServiceType.IPTV.value:
|
||||
if not show_error:
|
||||
@@ -750,8 +754,7 @@ class EpgDialog:
|
||||
def on_assign_ref(self, item=None):
|
||||
if self._current_ref:
|
||||
model, paths = self._bouquet_view.get_selection().get_selected_rows()
|
||||
self.assign_data(model[paths], self._current_ref.pop())
|
||||
self.update_epg_count()
|
||||
self.assign_refs(model, paths, self._current_ref.pop())
|
||||
|
||||
@run_idle
|
||||
def on_reset(self, item):
|
||||
@@ -841,8 +844,8 @@ class EpgDialog:
|
||||
model = view.get_model()
|
||||
data = data.get_text()
|
||||
if data:
|
||||
self.assign_data(model[path], data.split("::::"))
|
||||
self.update_epg_count()
|
||||
data = data.split("::::")
|
||||
self.assign_refs(model, path, data)
|
||||
return False
|
||||
|
||||
# ***************** Options *********************#
|
||||
|
||||
@@ -81,10 +81,18 @@ Author: Dmitriy Yefremov
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">EPG source</property>
|
||||
<property name="active">0</property>
|
||||
<property name="has_entry">True</property>
|
||||
<property name="active_id">0</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Receiver</item>
|
||||
</items>
|
||||
<child internal-child="entry">
|
||||
<object class="GtkEntry">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="editable">False</property>
|
||||
<property name="width_chars">10</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
||||
@@ -73,6 +73,11 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkImage" id="assign_ref_image">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="icon_name">insert-link</property>
|
||||
</object>
|
||||
<object class="GtkTreeStore" id="bouquets_tree_store">
|
||||
<columns>
|
||||
<!-- column-name bouquet -->
|
||||
@@ -1341,6 +1346,16 @@ Author: Dmitriy Yefremov
|
||||
<accelerator key="c" signal="activate" modifiers="Primary"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="services_reference_popup_item">
|
||||
<property name="label" translatable="yes">Copy reference</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="image">copy_image</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="on_reference_copy" object="services_tree_view" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="services_edit_popup_item">
|
||||
<property name="label">gtk-edit</property>
|
||||
@@ -1440,22 +1455,6 @@ Author: Dmitriy Yefremov
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="services_reference_picon_popup_item">
|
||||
<property name="label" translatable="yes">Copy reference</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="image">copy_image</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="on_reference_picon" object="services_tree_view" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="services_separatormenuitem_5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="services_remove_unused_picons_popup_item">
|
||||
<property name="label" translatable="yes">Remove all unused</property>
|
||||
@@ -1471,7 +1470,7 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="services_separatormenuitem_6">
|
||||
<object class="GtkSeparatorMenuItem" id="services_separatormenuitem_5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
@@ -4578,6 +4577,16 @@ Author: Dmitriy Yefremov
|
||||
<accelerator key="c" signal="activate" modifiers="Primary"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="fav_reference_popup_item">
|
||||
<property name="label" translatable="yes">Copy reference</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="image">copy_image_2</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="on_reference_copy" object="fav_tree_view" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="fav_paste_popup_item">
|
||||
<property name="label">gtk-paste</property>
|
||||
@@ -4673,7 +4682,7 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_3">
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_3">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
@@ -4747,7 +4756,7 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_5">
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
@@ -4794,11 +4803,22 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_6">
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_6">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="fav_assign_ref_popup_item">
|
||||
<property name="label" translatable="yes">Assign reference</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="image">assign_ref_image</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="on_reference_assign" object="fav_tree_view" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="fav_epg_configuration_popup_item">
|
||||
<property name="label" translatable="yes">EPG configuration</property>
|
||||
@@ -4810,7 +4830,7 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_7">
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_7">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
@@ -4826,7 +4846,7 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_8">
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_8">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
@@ -4860,7 +4880,7 @@ Author: Dmitriy Yefremov
|
||||
<property name="image">insert_image</property>
|
||||
<property name="use_stock">False</property>
|
||||
<child type="submenu">
|
||||
<object class="GtkMenu" id="fav_picon_popoup_menu">
|
||||
<object class="GtkMenu" id="fav_picon_popup_menu">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
@@ -4899,22 +4919,6 @@ Author: Dmitriy Yefremov
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="fav_reference_picon_popup_item">
|
||||
<property name="label" translatable="yes">Copy reference</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="image">copy_image_2</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="on_reference_picon" object="fav_tree_view" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_11">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="fav_remove_unused_picons_popup_item">
|
||||
<property name="label" translatable="yes">Remove all unused</property>
|
||||
@@ -4930,7 +4934,7 @@ Author: Dmitriy Yefremov
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_12">
|
||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_11">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from collections import Counter
|
||||
from contextlib import suppress
|
||||
@@ -95,7 +96,7 @@ class Application(Gtk.Application):
|
||||
_FAV_ELEMENTS = ("fav_cut_popup_item", "fav_paste_popup_item", "fav_locate_popup_item", "fav_iptv_popup_item",
|
||||
"fav_insert_marker_popup_item", "fav_insert_space_popup_item", "fav_edit_sub_menu_popup_item",
|
||||
"fav_edit_popup_item", "fav_picon_popup_item", "fav_copy_popup_item", "fav_add_alt_popup_item",
|
||||
"fav_epg_configuration_popup_item", "fav_mark_dup_popup_item")
|
||||
"fav_epg_configuration_popup_item", "fav_mark_dup_popup_item", "fav_reference_popup_item")
|
||||
|
||||
_BOUQUET_ELEMENTS = ("bouquets_new_popup_item", "bouquets_edit_popup_item", "bouquets_cut_popup_item",
|
||||
"bouquets_copy_popup_item", "bouquets_paste_popup_item", "new_header_button",
|
||||
@@ -132,6 +133,8 @@ class Application(Gtk.Application):
|
||||
"on_iptv_services_copy": self.on_iptv_services_copy,
|
||||
"on_fav_copy": self.on_fav_copy,
|
||||
"on_bouquets_copy": self.on_bouquets_copy,
|
||||
"on_reference_copy": self.on_reference_copy,
|
||||
"on_reference_assign": self.on_reference_assign,
|
||||
"on_fav_paste": self.on_fav_paste,
|
||||
"on_bouquets_paste": self.on_bouquets_paste,
|
||||
"on_rename_for_bouquet": self.on_rename_for_bouquet,
|
||||
@@ -184,7 +187,6 @@ class Application(Gtk.Application):
|
||||
"on_assign_picon_file": self.on_assign_picon_file,
|
||||
"on_assign_picon": self.on_assign_picon,
|
||||
"on_remove_picon": self.on_remove_picon,
|
||||
"on_reference_picon": self.on_reference_picon,
|
||||
"on_remove_unused_picons": self.on_remove_unused_picons,
|
||||
"on_iptv": self.on_iptv,
|
||||
"on_epg_list_configuration": self.on_epg_list_configuration,
|
||||
@@ -374,6 +376,9 @@ class Application(Gtk.Application):
|
||||
self._fav_view.connect("key-press-event", self.force_ctrl)
|
||||
# Clipboard
|
||||
self._clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
||||
ref_item = builder.get_object("fav_assign_ref_popup_item")
|
||||
self.bind_property("is_enigma", ref_item, "visible")
|
||||
self._clipboard.connect("owner-change", lambda c, o: ref_item.set_sensitive(c.wait_is_text_available()))
|
||||
# Wait dialog
|
||||
self._wait_dialog = WaitDialog(self._main_window)
|
||||
# Filter
|
||||
@@ -1129,6 +1134,10 @@ class Application(Gtk.Application):
|
||||
if to_copy:
|
||||
self._bouquets_buffer.extend([model[i][:] for i in to_copy])
|
||||
|
||||
def on_reference_copy(self, view):
|
||||
""" Copying picon id to clipboard. """
|
||||
copy_reference(self.get_target_view(view), view, self._services, self._clipboard, self._main_window)
|
||||
|
||||
def on_fav_cut(self, view):
|
||||
self.on_cut(view, ViewTarget.FAV)
|
||||
|
||||
@@ -2926,6 +2935,35 @@ class Application(Gtk.Application):
|
||||
gen = self.remove_favs(response, self._fav_model)
|
||||
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
|
||||
|
||||
def on_reference_assign(self, view):
|
||||
""" Assigns DVB reference to the selected IPTV services. """
|
||||
model, paths = view.get_selection().get_selected_rows()
|
||||
iptv_paths = [p for p in paths if model[p][Column.FAV_TYPE] == BqServiceType.IPTV.value]
|
||||
if not iptv_paths:
|
||||
self.show_error_message("No IPTV services selected!")
|
||||
return
|
||||
|
||||
ref = self._clipboard.wait_for_text()
|
||||
if ref and re.match(r"\d+_\d+_\d+_\w+_\d+_\d+_\d+_0_0_0", ref):
|
||||
[self.assign_reference(model, p, ref) for p in iptv_paths]
|
||||
self._clipboard.clear()
|
||||
|
||||
def assign_reference(self, model, path, ref):
|
||||
ref_data = ref.split("_")
|
||||
row = model[path]
|
||||
fav_id = row[Column.FAV_ID]
|
||||
fav_id_data = fav_id.split(":")
|
||||
fav_id_data[3:7] = ref_data[3:7]
|
||||
new_fav_id = ":".join(fav_id_data)
|
||||
new_data_id = ":".join(fav_id_data[:11]).strip()
|
||||
old_srv = self._services.pop(fav_id, None)
|
||||
if old_srv:
|
||||
picon_id_data = old_srv.picon_id.split("_")
|
||||
picon_id_data[3:7] = ref_data[3:7]
|
||||
new_service = old_srv._replace(data_id=new_data_id, fav_id=new_fav_id, picon_id="_".join(picon_id_data))
|
||||
self._services[new_fav_id] = new_service
|
||||
self.emit("iptv-service-edited", (old_srv, new_service))
|
||||
|
||||
# ****************** EPG ********************** #
|
||||
|
||||
def set_display_epg(self, action, value):
|
||||
@@ -3925,10 +3963,6 @@ class Application(Gtk.Application):
|
||||
def on_remove_picon(self, view):
|
||||
remove_picon(self.get_target_view(view), self._services_view, self._fav_view, self._picons, self._settings)
|
||||
|
||||
def on_reference_picon(self, view):
|
||||
""" Copying picon id to clipboard """
|
||||
copy_picon_reference(self.get_target_view(view), view, self._services, self._clipboard, self._main_window)
|
||||
|
||||
def on_remove_unused_picons(self, item):
|
||||
if show_dialog(DialogType.QUESTION, self._main_window) == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
""" Helper module for the GUI. """
|
||||
|
||||
__all__ = ("insert_marker", "move_items", "rename", "ViewTarget", "set_flags", "locate_in_services",
|
||||
"scroll_to", "get_base_model", "copy_picon_reference", "assign_picons", "remove_picon",
|
||||
"scroll_to", "get_base_model", "copy_reference", "assign_picons", "remove_picon",
|
||||
"is_only_one_item_selected", "gen_bouquets", "BqGenType", "get_selection",
|
||||
"get_model_data", "remove_all_unused_picons", "get_picon_pixbuf", "get_base_itrs", "get_iptv_url",
|
||||
"get_iptv_data", "update_entry_data", "append_text_to_tview", "on_popup_menu")
|
||||
@@ -523,27 +523,6 @@ def remove_picon(target, srv_view, fav_view, picons, settings):
|
||||
remove_picons(settings, picon_ids, picons)
|
||||
|
||||
|
||||
def copy_picon_reference(target, view, services, clipboard, transient):
|
||||
""" Copying picon id to clipboard """
|
||||
model, paths = view.get_selection().get_selected_rows()
|
||||
if not is_only_one_item_selected(paths, transient):
|
||||
return
|
||||
|
||||
if target is ViewTarget.SERVICES:
|
||||
picon_id = model.get_value(model.get_iter(paths), Column.SRV_PICON_ID)
|
||||
if picon_id:
|
||||
clipboard.set_text(picon_id.rstrip(".png"), -1)
|
||||
else:
|
||||
show_dialog(DialogType.ERROR, transient, "No reference is present!")
|
||||
elif target is ViewTarget.FAV:
|
||||
fav_id = model.get_value(model.get_iter(paths), Column.FAV_ID)
|
||||
srv = services.get(fav_id, None)
|
||||
if srv and srv.picon_id:
|
||||
clipboard.set_text(srv.picon_id.rstrip(".png"), -1)
|
||||
else:
|
||||
show_dialog(DialogType.ERROR, transient, "No reference is present!")
|
||||
|
||||
|
||||
def remove_all_unused_picons(settings, services):
|
||||
""" Removes picons from profile picons folder if there are no services for these picons. """
|
||||
ids = {s.picon_id for s in services}
|
||||
@@ -637,7 +616,28 @@ def get_bouquets_names(model):
|
||||
return bouquets_names
|
||||
|
||||
|
||||
# ***************** Others *********************#
|
||||
# ***************** Others ********************* #
|
||||
|
||||
def copy_reference(target, view, services, clipboard, transient):
|
||||
""" Copying picon id to clipboard """
|
||||
model, paths = view.get_selection().get_selected_rows()
|
||||
if not is_only_one_item_selected(paths, transient):
|
||||
return
|
||||
|
||||
if target is ViewTarget.SERVICES:
|
||||
picon_id = model.get_value(model.get_iter(paths), Column.SRV_PICON_ID)
|
||||
if picon_id:
|
||||
clipboard.set_text(picon_id.rstrip(".png"), -1)
|
||||
else:
|
||||
show_dialog(DialogType.ERROR, transient, "No reference is present!")
|
||||
elif target is ViewTarget.FAV:
|
||||
fav_id = model.get_value(model.get_iter(paths), Column.FAV_ID)
|
||||
srv = services.get(fav_id, None)
|
||||
if srv and srv.picon_id:
|
||||
clipboard.set_text(srv.picon_id.rstrip(".png"), -1)
|
||||
else:
|
||||
show_dialog(DialogType.ERROR, transient, "No reference is present!")
|
||||
|
||||
|
||||
def update_entry_data(entry, dialog, settings):
|
||||
""" Updates value in text entry from chooser dialog. """
|
||||
|
||||
Reference in New Issue
Block a user