mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2025-12-21 16:09:41 +01:00
added extra tab for IPTV
This commit is contained in:
@@ -40,6 +40,7 @@ from app.ui.uicommons import IPTV_ICON
|
|||||||
NEUTRINO_FAV_ID_FORMAT = "{}::{}::{}::{}::{}::{}::{}::{}::{}::{}"
|
NEUTRINO_FAV_ID_FORMAT = "{}::{}::{}::{}::{}::{}::{}::{}::{}::{}"
|
||||||
ENIGMA2_FAV_ID_FORMAT = " {}:{}:{}:{:X}:{:X}:{:X}:{:X}:0:0:0:{}:{}\n#DESCRIPTION: {}\n"
|
ENIGMA2_FAV_ID_FORMAT = " {}:{}:{}:{:X}:{:X}:{:X}:{:X}:0:0:0:{}:{}\n#DESCRIPTION: {}\n"
|
||||||
MARKER_FORMAT = " 1:64:{}:0:0:0:0:0:0:0::{}\n#DESCRIPTION {}\n"
|
MARKER_FORMAT = " 1:64:{}:0:0:0:0:0:0:0::{}\n#DESCRIPTION {}\n"
|
||||||
|
PICON_FORMAT = "{}_{}_{:X}_{:X}_{:X}_{:X}_{:X}_0_0_0.png"
|
||||||
|
|
||||||
|
|
||||||
class StreamType(Enum):
|
class StreamType(Enum):
|
||||||
@@ -115,6 +116,9 @@ def parse_m3u(path, s_type, detect_encoding=True, params=None):
|
|||||||
params[0] = sid_counter
|
params[0] = sid_counter
|
||||||
sid_counter += 1
|
sid_counter += 1
|
||||||
fav_id = get_fav_id(url, name, s_type, params)
|
fav_id = get_fav_id(url, name, s_type, params)
|
||||||
|
if s_type is SettingsType.ENIGMA_2:
|
||||||
|
p_id = get_picon_id(params)
|
||||||
|
|
||||||
if all((name, url, fav_id)):
|
if all((name, url, fav_id)):
|
||||||
srv = Service(None, None, IPTV_ICON, name, *aggr[0:3], st, picon, p_id, *s_aggr, url, fav_id, None)
|
srv = Service(None, None, IPTV_ICON, name, *aggr[0:3], st, picon, p_id, *s_aggr, url, fav_id, None)
|
||||||
services.append(srv)
|
services.append(srv)
|
||||||
@@ -159,5 +163,11 @@ def get_fav_id(url, name, settings_type, params=None, st_type=None, s_id=0, srv_
|
|||||||
return NEUTRINO_FAV_ID_FORMAT.format(url, "", 0, None, None, None, None, "", "", 1)
|
return NEUTRINO_FAV_ID_FORMAT.format(url, "", 0, None, None, None, None, "", "", 1)
|
||||||
|
|
||||||
|
|
||||||
|
def get_picon_id(params=None, st_type=None, s_id=0, srv_type=1):
|
||||||
|
st_type = st_type or StreamType.NONE_TS.value
|
||||||
|
params = params or (0, 0, 0, 0)
|
||||||
|
return PICON_FORMAT.format(st_type, s_id, srv_type, *params)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -617,10 +617,10 @@ class TimerTool(Gtk.Box):
|
|||||||
return
|
return
|
||||||
|
|
||||||
fav_id = None
|
fav_id = None
|
||||||
if source == self._app.FAV_MODEL_NAME:
|
if source == self._app.FAV_MODEL:
|
||||||
model = self._app.fav_view.get_model()
|
model = self._app.fav_view.get_model()
|
||||||
fav_id = model.get_value(model.get_iter_from_string(itrs[0]), Column.FAV_ID)
|
fav_id = model.get_value(model.get_iter_from_string(itrs[0]), Column.FAV_ID)
|
||||||
elif source == self._app.SERVICE_MODEL_NAME:
|
elif source == self._app.SERVICE_MODEL:
|
||||||
model = self._app.services_view.get_model()
|
model = self._app.services_view.get_model()
|
||||||
fav_id = model.get_value(model.get_iter_from_string(itrs[0]), Column.SRV_FAV_ID)
|
fav_id = model.get_value(model.get_iter_from_string(itrs[0]), Column.SRV_FAV_ID)
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# The MIT License (MIT)
|
# The MIT License (MIT)
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018-2021 Dmitriy Yefremov
|
# Copyright (c) 2018-2022 Dmitriy Yefremov
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -44,7 +44,7 @@ from app.eparser.iptv import (NEUTRINO_FAV_ID_FORMAT, StreamType, ENIGMA2_FAV_ID
|
|||||||
from app.settings import SettingsType
|
from app.settings import SettingsType
|
||||||
from app.tools.yt import YouTubeException, YouTube
|
from app.tools.yt import YouTubeException, YouTube
|
||||||
from app.ui.dialogs import Action, show_dialog, DialogType, get_message, get_builder
|
from app.ui.dialogs import Action, show_dialog, DialogType, get_message, get_builder
|
||||||
from app.ui.main_helper import get_base_model, get_iptv_url, on_popup_menu, get_picon_pixbuf
|
from app.ui.main_helper import get_iptv_url, on_popup_menu, get_picon_pixbuf
|
||||||
from app.ui.uicommons import (Gtk, Gdk, UI_RESOURCES_PATH, IPTV_ICON, Column, KeyboardKey, get_yt_icon)
|
from app.ui.uicommons import (Gtk, Gdk, UI_RESOURCES_PATH, IPTV_ICON, Column, KeyboardKey, get_yt_icon)
|
||||||
|
|
||||||
_DIGIT_ENTRY_NAME = "digit-entry"
|
_DIGIT_ENTRY_NAME = "digit-entry"
|
||||||
@@ -77,7 +77,7 @@ def get_stream_type(box):
|
|||||||
|
|
||||||
class IptvDialog:
|
class IptvDialog:
|
||||||
|
|
||||||
def __init__(self, transient, view, services, bouquet, settings, action=Action.ADD):
|
def __init__(self, app, view, bouquet=None, service=None, action=Action.ADD):
|
||||||
handlers = {"on_response": self.on_response,
|
handlers = {"on_response": self.on_response,
|
||||||
"on_entry_changed": self.on_entry_changed,
|
"on_entry_changed": self.on_entry_changed,
|
||||||
"on_url_changed": self.on_url_changed,
|
"on_url_changed": self.on_url_changed,
|
||||||
@@ -86,11 +86,11 @@ class IptvDialog:
|
|||||||
"on_yt_quality_changed": self.on_yt_quality_changed,
|
"on_yt_quality_changed": self.on_yt_quality_changed,
|
||||||
"on_info_bar_close": self.on_info_bar_close}
|
"on_info_bar_close": self.on_info_bar_close}
|
||||||
|
|
||||||
|
self._app = app
|
||||||
self._action = action
|
self._action = action
|
||||||
self._s_type = settings.setting_type
|
self._settings = app.app_settings
|
||||||
self._settings = settings
|
self._s_type = self._settings.setting_type
|
||||||
self._bouquet = bouquet
|
self._bouquet = bouquet
|
||||||
self._services = services
|
|
||||||
self._yt_links = None
|
self._yt_links = None
|
||||||
self._yt_dl = None
|
self._yt_dl = None
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ class IptvDialog:
|
|||||||
objects=("iptv_dialog", "stream_type_liststore", "yt_quality_liststore"))
|
objects=("iptv_dialog", "stream_type_liststore", "yt_quality_liststore"))
|
||||||
|
|
||||||
self._dialog = builder.get_object("iptv_dialog")
|
self._dialog = builder.get_object("iptv_dialog")
|
||||||
self._dialog.set_transient_for(transient)
|
self._dialog.set_transient_for(app.app_window)
|
||||||
self._name_entry = builder.get_object("name_entry")
|
self._name_entry = builder.get_object("name_entry")
|
||||||
self._description_entry = builder.get_object("description_entry")
|
self._description_entry = builder.get_object("description_entry")
|
||||||
self._url_entry = builder.get_object("url_entry")
|
self._url_entry = builder.get_object("url_entry")
|
||||||
@@ -142,7 +142,7 @@ class IptvDialog:
|
|||||||
self.update_reference_entry()
|
self.update_reference_entry()
|
||||||
self._stream_type_combobox.set_active(1)
|
self._stream_type_combobox.set_active(1)
|
||||||
elif self._action is Action.EDIT:
|
elif self._action is Action.EDIT:
|
||||||
self._current_srv = get_base_model(self._model)[self._paths][:]
|
self._current_srv = service
|
||||||
self.init_data(self._current_srv)
|
self.init_data(self._current_srv)
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
@@ -167,8 +167,8 @@ class IptvDialog:
|
|||||||
self._dialog.destroy()
|
self._dialog.destroy()
|
||||||
|
|
||||||
def init_data(self, srv):
|
def init_data(self, srv):
|
||||||
name, fav_id = srv[2], srv[7]
|
fav_id = srv.fav_id
|
||||||
self._name_entry.set_text(name)
|
self._name_entry.set_text(srv.service)
|
||||||
self.init_enigma2_data(fav_id) if self._s_type is SettingsType.ENIGMA_2 else self.init_neutrino_data(fav_id)
|
self.init_enigma2_data(fav_id) if self._s_type is SettingsType.ENIGMA_2 else self.init_neutrino_data(fav_id)
|
||||||
|
|
||||||
def init_enigma2_data(self, fav_id):
|
def init_enigma2_data(self, fav_id):
|
||||||
@@ -307,11 +307,12 @@ class IptvDialog:
|
|||||||
int(self._namespace_entry.get_text()),
|
int(self._namespace_entry.get_text()),
|
||||||
quote(self._url_entry.get_text()),
|
quote(self._url_entry.get_text()),
|
||||||
name, name)
|
name, name)
|
||||||
|
|
||||||
self.update_bouquet_data(name, fav_id)
|
self.update_bouquet_data(name, fav_id)
|
||||||
|
|
||||||
def save_neutrino_data(self):
|
def save_neutrino_data(self):
|
||||||
if self._action is Action.EDIT:
|
if self._action is Action.EDIT:
|
||||||
id_data = self._current_srv[7].split("::")
|
id_data = self._current_srv.fav_id.split("::")
|
||||||
else:
|
else:
|
||||||
id_data = ["", "", "0", None, None, None, None, "", "", "1"]
|
id_data = ["", "", "0", None, None, None, None, "", "", "1"]
|
||||||
id_data[0] = self._url_entry.get_text()
|
id_data[0] = self._url_entry.get_text()
|
||||||
@@ -320,20 +321,25 @@ class IptvDialog:
|
|||||||
self._dialog.destroy()
|
self._dialog.destroy()
|
||||||
|
|
||||||
def update_bouquet_data(self, name, fav_id):
|
def update_bouquet_data(self, name, fav_id):
|
||||||
|
picon_id = f"{self._reference_entry.get_text().replace(':', '_')}.png"
|
||||||
|
|
||||||
if self._action is Action.EDIT:
|
if self._action is Action.EDIT:
|
||||||
old_srv = self._services.pop(self._current_srv[7])
|
services = self._app.current_services
|
||||||
self._services[fav_id] = old_srv._replace(service=name, fav_id=fav_id)
|
old_srv = services.pop(self._current_srv.fav_id)
|
||||||
self._bouquet[self._paths[0][0]] = fav_id
|
new_service = old_srv._replace(service=name, fav_id=fav_id, picon_id=picon_id)
|
||||||
self._model.set(self._model.get_iter(self._paths), {Column.FAV_SERVICE: name, Column.FAV_ID: fav_id})
|
services[fav_id] = new_service
|
||||||
|
self._app.emit("iptv-service-edited", (old_srv, new_service))
|
||||||
else:
|
else:
|
||||||
aggr = [None] * 10
|
aggr = [None] * 8
|
||||||
s_type = BqServiceType.IPTV.name
|
s_type = BqServiceType.IPTV.name
|
||||||
srv = (None, None, name, None, None, s_type, None, fav_id, *aggr[0:3])
|
srv = (None, None, name, None, None, s_type, None, fav_id, *aggr[0:3])
|
||||||
itr = self._model.insert_after(self._model.get_iter(self._paths[0]),
|
itr = self._model.insert_after(self._model.get_iter(self._paths[0]),
|
||||||
srv) if self._paths else self._model.insert(0, srv)
|
srv) if self._paths else self._model.insert(0, srv)
|
||||||
self._model.set_value(itr, 1, IPTV_ICON)
|
self._model.set_value(itr, 1, IPTV_ICON)
|
||||||
self._bouquet.insert(self._model.get_path(itr)[0], fav_id)
|
self._bouquet.insert(self._model.get_path(itr)[0], fav_id)
|
||||||
self._services[fav_id] = Service(None, None, IPTV_ICON, name, *aggr[0:3], s_type, *aggr, fav_id, None)
|
service = Service(None, None, IPTV_ICON, name, *aggr[0:3], s_type, None, picon_id, *aggr, fav_id, None)
|
||||||
|
self._app.current_services[fav_id] = service
|
||||||
|
self._app.emit("iptv-service-added", (service,))
|
||||||
|
|
||||||
@run_idle
|
@run_idle
|
||||||
def on_info_bar_close(self, bar=None, resp=None):
|
def on_info_bar_close(self, bar=None, resp=None):
|
||||||
@@ -833,7 +839,7 @@ class M3uImportDialog(IptvListDialog):
|
|||||||
|
|
||||||
|
|
||||||
class YtListImportDialog:
|
class YtListImportDialog:
|
||||||
def __init__(self, transient, settings, appender):
|
def __init__(self, app):
|
||||||
handlers = {"on_import": self.on_import,
|
handlers = {"on_import": self.on_import,
|
||||||
"on_receive": self.on_receive,
|
"on_receive": self.on_receive,
|
||||||
"on_yt_url_entry_changed": self.on_url_entry_changed,
|
"on_yt_url_entry_changed": self.on_url_entry_changed,
|
||||||
@@ -845,12 +851,13 @@ class YtListImportDialog:
|
|||||||
"on_key_press": self.on_key_press,
|
"on_key_press": self.on_key_press,
|
||||||
"on_close": self.on_close}
|
"on_close": self.on_close}
|
||||||
|
|
||||||
self.appender = appender
|
# self._main_window, self._settings, self.append_imported_services
|
||||||
self._s_type = settings.setting_type
|
self.appender = app.append_imported_services
|
||||||
|
self._settings = app.app_settings
|
||||||
|
self._s_type = self._settings.setting_type
|
||||||
self._download_task = False
|
self._download_task = False
|
||||||
self._yt_list_id = None
|
self._yt_list_id = None
|
||||||
self._yt_list_title = None
|
self._yt_list_title = None
|
||||||
self._settings = settings
|
|
||||||
self._yt = None
|
self._yt = None
|
||||||
|
|
||||||
builder = get_builder(_UI_PATH, handlers, use_str=True,
|
builder = get_builder(_UI_PATH, handlers, use_str=True,
|
||||||
@@ -859,7 +866,7 @@ class YtListImportDialog:
|
|||||||
"yt_import_image"))
|
"yt_import_image"))
|
||||||
|
|
||||||
self._dialog = builder.get_object("yt_import_dialog_window")
|
self._dialog = builder.get_object("yt_import_dialog_window")
|
||||||
self._dialog.set_transient_for(transient)
|
self._dialog.set_transient_for(app.app_window)
|
||||||
self._list_view_scrolled_window = builder.get_object("yt_list_view_scrolled_window")
|
self._list_view_scrolled_window = builder.get_object("yt_list_view_scrolled_window")
|
||||||
self._model = builder.get_object("yt_liststore")
|
self._model = builder.get_object("yt_liststore")
|
||||||
self._progress_bar = builder.get_object("yt_progress_bar")
|
self._progress_bar = builder.get_object("yt_progress_bar")
|
||||||
|
|||||||
@@ -236,6 +236,70 @@ Author: Dmitriy Yefremov
|
|||||||
<column type="GdkRGBA"/>
|
<column type="GdkRGBA"/>
|
||||||
</columns>
|
</columns>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkListStore" id="filter_bouquet_list_store">
|
||||||
|
<columns>
|
||||||
|
<!-- column-name bouquet -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name selected -->
|
||||||
|
<column type="gboolean"/>
|
||||||
|
</columns>
|
||||||
|
<data>
|
||||||
|
<row>
|
||||||
|
<col id="0" translatable="yes">All bouquets</col>
|
||||||
|
<col id="1">True</col>
|
||||||
|
</row>
|
||||||
|
</data>
|
||||||
|
</object>
|
||||||
|
<object class="GtkPopover" id="filter_bouquets_popover">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow" id="filter_bouquet_scrolled_window">
|
||||||
|
<property name="width_request">150</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="margin_top">5</property>
|
||||||
|
<property name="margin_bottom">5</property>
|
||||||
|
<property name="hscrollbar_policy">never</property>
|
||||||
|
<property name="max_content_height">350</property>
|
||||||
|
<property name="propagate_natural_height">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeView" id="filter_bouquet_view">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="model">filter_bouquet_list_store</property>
|
||||||
|
<property name="headers_visible">False</property>
|
||||||
|
<property name="enable_search">False</property>
|
||||||
|
<property name="search_column">0</property>
|
||||||
|
<child internal-child="selection">
|
||||||
|
<object class="GtkTreeSelection"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="fiter_bouquet_column">
|
||||||
|
<property name="title" translatable="yes">Satellite</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="filter_bouquet_renderer_text">
|
||||||
|
<property name="ellipsize">end</property>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">0</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererToggle" id="filter_bouquet_renderer_toggle">
|
||||||
|
<property name="xalign">0.98000001907348633</property>
|
||||||
|
<signal name="toggled" handler="on_filter_bouquet_toggled" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="active">1</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
<object class="GtkListStore" id="filter_sat_pos_list_store">
|
<object class="GtkListStore" id="filter_sat_pos_list_store">
|
||||||
<columns>
|
<columns>
|
||||||
<!-- column-name satellite -->
|
<!-- column-name satellite -->
|
||||||
@@ -424,6 +488,99 @@ Author: Dmitriy Yefremov
|
|||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="icon_name">insert-text</property>
|
<property name="icon_name">insert-text</property>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkListStore" id="iptv_list_store">
|
||||||
|
<columns>
|
||||||
|
<!-- column-name service -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name type -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name picon -->
|
||||||
|
<column type="GdkPixbuf"/>
|
||||||
|
<!-- column-name ref -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name fav_id -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name picon_id -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
</columns>
|
||||||
|
</object>
|
||||||
|
<object class="GtkTreeModelFilter" id="iptv_services_model_filter">
|
||||||
|
<property name="child_model">iptv_list_store</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkTreeModelSort" id="iptv_services_model_sort">
|
||||||
|
<property name="model">iptv_services_model_filter</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkMenu" id="iptv_popup_menu">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="iptv_to_fav_end_move_popup_item">
|
||||||
|
<property name="label">gtk-goto-last</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="activate" handler="on_to_fav_end_copy" object="iptv_services_view" swapped="no"/>
|
||||||
|
<accelerator key="BackSpace" signal="activate" modifiers="Primary"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="iptv_to_fav_move_popup_item">
|
||||||
|
<property name="label">gtk-goto-first</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="activate" handler="on_to_fav_copy" object="iptv_services_view" swapped="no"/>
|
||||||
|
<accelerator key="Insert" signal="activate" modifiers="Primary"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparatorMenuItem" id="iptv_separator_popup_item">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="iptv_copy_popup_item">
|
||||||
|
<property name="label">gtk-copy</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="activate" handler="on_iptv_services_copy" object="iptv_services_view" swapped="no"/>
|
||||||
|
<accelerator key="c" signal="activate" modifiers="Primary"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="iptv_edit_popup_item">
|
||||||
|
<property name="label">gtk-edit</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="activate" handler="on_edit" swapped="no"/>
|
||||||
|
<accelerator key="e" signal="activate" modifiers="Primary"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparatorMenuItem" id="iptv_separator_popup_item_2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="iptv_remove_popup_item">
|
||||||
|
<property name="label">gtk-remove</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="activate" handler="on_delete" object="iptv_services_view" swapped="no"/>
|
||||||
|
<accelerator key="Delete" signal="activate"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
<object class="GtkPopoverMenu" id="left_header_popover_menu">
|
<object class="GtkPopoverMenu" id="left_header_popover_menu">
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -1487,6 +1644,27 @@ Author: Dmitriy Yefremov
|
|||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkToggleButton" id="filter_iptv_services_button">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="focus_on_click">False</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Filter</property>
|
||||||
|
<signal name="toggled" handler="on_iptv_services_filter_toggled" swapped="no"/>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="filter_iptv_services_button_image">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="icon_name">edit-find-replace-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkToggleButton" id="srv_search_button">
|
<object class="GtkToggleButton" id="srv_search_button">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@@ -1508,6 +1686,94 @@ Author: Dmitriy Yefremov
|
|||||||
<property name="position">2</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkToggleButton" id="iptv_search_button">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="focus_on_click">False</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Search</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="iptv_search_button_image">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="icon_name">edit-find-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child type="center">
|
||||||
|
<object class="GtkButtonBox" id="services_button_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="layout_style">expand</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="dvb_button">
|
||||||
|
<property name="label" translatable="yes">DVB</property>
|
||||||
|
<property name="width_request">80</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">False</property>
|
||||||
|
<property name="group">iptv_button</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="iptv_button">
|
||||||
|
<property name="label" translatable="yes">IPTV</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">False</property>
|
||||||
|
<property name="group">dvb_button</property>
|
||||||
|
<signal name="toggled" handler="on_iptv_toggled" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="iptv_export_to_m3u_button">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="focus_on_click">False</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Export to m3u</property>
|
||||||
|
<signal name="clicked" handler="on_export_all_iptv_to_m3u" swapped="no"/>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="iptv_export_to_m3u_image">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="icon_name">document-save-as-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="enigma_lock_hide_box">
|
<object class="GtkBox" id="enigma_lock_hide_box">
|
||||||
<property name="sensitive">False</property>
|
<property name="sensitive">False</property>
|
||||||
@@ -1573,6 +1839,16 @@ Author: Dmitriy Yefremov
|
|||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkStack" id="services_stack">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="transition_type">crossfade</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="dvb_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="services_fs_box">
|
<object class="GtkBox" id="services_fs_box">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@@ -1763,7 +2039,7 @@ Author: Dmitriy Yefremov
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -2166,7 +2442,7 @@ Author: Dmitriy Yefremov
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">2</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -2326,7 +2602,349 @@ Author: Dmitriy Yefremov
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">3</property>
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="name">dvb</property>
|
||||||
|
<property name="title" translatable="yes">DVB</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="iptv_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="iptv_services_fs_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="margin_left">5</property>
|
||||||
|
<property name="margin_right">5</property>
|
||||||
|
<property name="margin_bottom">5</property>
|
||||||
|
<property name="spacing">10</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="iptv_filter_box">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSearchEntry" id="iptv_filter_entry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="primary_icon_name">edit-find-replace-symbolic</property>
|
||||||
|
<property name="primary_icon_activatable">False</property>
|
||||||
|
<property name="primary_icon_sensitive">False</property>
|
||||||
|
<signal name="search-changed" handler="on_iptv_filter_changed" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkMenuButton" id="filter_bq_button">
|
||||||
|
<property name="width_request">50</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="focus_on_click">False</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="popover">filter_bouquets_popover</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="filter_bq_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Bouquets</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkToggleButton" id="iptv_filter_not_in_bq_button">
|
||||||
|
<property name="label" translatable="yes">Not in Bouquets</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Do not show services present in Bouquets.</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<style>
|
||||||
|
<class name="group"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="iptv_search_box">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSearchEntry" id="iptv_search_entry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="primary_icon_name">edit-find-symbolic</property>
|
||||||
|
<property name="primary_icon_activatable">False</property>
|
||||||
|
<property name="primary_icon_sensitive">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="iptv_search_down_button">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkArrow" id="iptv_dow_arrow">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="arrow_type">down</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="iptv_search_up_button">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkArrow" id="iptv_up_arrow">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="arrow_type">up</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<style>
|
||||||
|
<class name="group"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow" id="iptv_services_scrolled_window">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="shadow_type">in</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeView" id="iptv_services_view">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="model">iptv_services_model_sort</property>
|
||||||
|
<property name="enable_search">False</property>
|
||||||
|
<property name="fixed_height_mode">True</property>
|
||||||
|
<property name="rubber_banding">True</property>
|
||||||
|
<property name="enable_grid_lines">both</property>
|
||||||
|
<property name="activate_on_single_click">True</property>
|
||||||
|
<signal name="button-press-event" handler="on_view_popup_menu" object="iptv_popup_menu" swapped="no"/>
|
||||||
|
<signal name="button-press-event" handler="on_view_press" swapped="no"/>
|
||||||
|
<signal name="button-release-event" handler="on_view_release" swapped="no"/>
|
||||||
|
<signal name="drag-begin" handler="on_view_drag_begin" after="yes" swapped="no"/>
|
||||||
|
<signal name="drag-data-get" handler="on_view_drag_data_get" swapped="no"/>
|
||||||
|
<signal name="drag-drop" handler="on_services_view_drag_drop" swapped="no"/>
|
||||||
|
<signal name="drag-end" handler="on_view_drag_end" swapped="no"/>
|
||||||
|
<signal name="key-press-event" handler="on_tree_view_key_press" swapped="no"/>
|
||||||
|
<child internal-child="selection">
|
||||||
|
<object class="GtkTreeSelection" id="iptv_services_selection">
|
||||||
|
<property name="mode">multiple</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="iptv_service_column">
|
||||||
|
<property name="resizable">True</property>
|
||||||
|
<property name="sizing">fixed</property>
|
||||||
|
<property name="min_width">170</property>
|
||||||
|
<property name="title" translatable="yes">Service</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="clickable">True</property>
|
||||||
|
<property name="alignment">0.5</property>
|
||||||
|
<property name="sort_column_id">0</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="iptv_service_renderer">
|
||||||
|
<property name="xpad">5</property>
|
||||||
|
<property name="ellipsize">end</property>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">0</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="iptv_type_column">
|
||||||
|
<property name="sizing">fixed</property>
|
||||||
|
<property name="min_width">100</property>
|
||||||
|
<property name="title" translatable="yes">Type</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="clickable">True</property>
|
||||||
|
<property name="alignment">0.5</property>
|
||||||
|
<property name="sort_column_id">1</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="iptv_type_renderer">
|
||||||
|
<property name="xalign">0.50999999046325684</property>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">1</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="iptv_picon_column">
|
||||||
|
<property name="sizing">fixed</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
|
<property name="title" translatable="yes">Picon</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="alignment">0.5</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererPixbuf" id="iptv_picon_renderer">
|
||||||
|
<property name="ypad">2</property>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="pixbuf">2</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="iptv_ref_column">
|
||||||
|
<property name="sizing">fixed</property>
|
||||||
|
<property name="min_width">150</property>
|
||||||
|
<property name="title" translatable="yes">Reference</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="clickable">True</property>
|
||||||
|
<property name="alignment">0.5</property>
|
||||||
|
<property name="sort_column_id">3</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="iptv_ref_renderer">
|
||||||
|
<property name="xpad">5</property>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">3</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="iptv_services_bar_box">
|
||||||
|
<property name="height_request">26</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="margin_left">5</property>
|
||||||
|
<property name="margin_right">5</property>
|
||||||
|
<property name="spacing">2</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="iptv_services_count_image">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="icon_name">document-properties</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="iptv_count_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">0</property>
|
||||||
|
<property name="width_chars">10</property>
|
||||||
|
<property name="max_width_chars">10</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSpinner" id="iptv_services_load_spinner">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Loading data...</property>
|
||||||
|
<property name="halign">center</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="name">iptv</property>
|
||||||
|
<property name="title" translatable="yes">IPTV</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -3387,7 +4005,7 @@ Author: Dmitriy Yefremov
|
|||||||
<property name="margin_right">5</property>
|
<property name="margin_right">5</property>
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="image3">
|
<object class="GtkImage" id="bq_count_image">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="icon_name">document-properties</property>
|
<property name="icon_name">document-properties</property>
|
||||||
|
|||||||
552
app/ui/main.py
552
app/ui/main.py
File diff suppressed because it is too large
Load Diff
@@ -360,7 +360,7 @@ def has_locked_hide(model, paths, col_num):
|
|||||||
|
|
||||||
# ***************** Location *******************#
|
# ***************** Location *******************#
|
||||||
|
|
||||||
def locate_in_services(fav_view, services_view, parent_window):
|
def locate_in_services(fav_view, services_view, column, parent_window):
|
||||||
""" Locating and scrolling to the service """
|
""" Locating and scrolling to the service """
|
||||||
model, paths = fav_view.get_selection().get_selected_rows()
|
model, paths = fav_view.get_selection().get_selected_rows()
|
||||||
|
|
||||||
@@ -372,7 +372,7 @@ def locate_in_services(fav_view, services_view, parent_window):
|
|||||||
|
|
||||||
fav_id = model.get_value(model.get_iter(paths[0]), Column.FAV_ID)
|
fav_id = model.get_value(model.get_iter(paths[0]), Column.FAV_ID)
|
||||||
for index, row in enumerate(services_view.get_model()):
|
for index, row in enumerate(services_view.get_model()):
|
||||||
if row[Column.SRV_FAV_ID] == fav_id:
|
if row[column] == fav_id:
|
||||||
scroll_to(index, services_view)
|
scroll_to(index, services_view)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ class PiconManager(Gtk.Box):
|
|||||||
return
|
return
|
||||||
|
|
||||||
itr_str, sep, src = txt.partition(self._app.DRAG_SEP)
|
itr_str, sep, src = txt.partition(self._app.DRAG_SEP)
|
||||||
if src == self._app.BQ_MODEL_NAME:
|
if src == self._app.BQ_MODEL:
|
||||||
return
|
return
|
||||||
|
|
||||||
path, pos = view.get_dest_row_at_pos(x, y) or (None, None)
|
path, pos = view.get_dest_row_at_pos(x, y) or (None, None)
|
||||||
@@ -385,7 +385,7 @@ class PiconManager(Gtk.Box):
|
|||||||
return
|
return
|
||||||
|
|
||||||
model = view.get_model()
|
model = view.get_model()
|
||||||
if src == self._app.FAV_MODEL_NAME:
|
if src == self._app.FAV_MODEL:
|
||||||
target_view = self._app.fav_view
|
target_view = self._app.fav_view
|
||||||
c_id = Column.FAV_ID
|
c_id = Column.FAV_ID
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# The MIT License (MIT)
|
# The MIT License (MIT)
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018-2021 Dmitriy Yefremov
|
# Copyright (c) 2018-2022 Dmitriy Yefremov
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -62,7 +62,7 @@ class ServiceDetailsDialog:
|
|||||||
|
|
||||||
_DIGIT_ENTRY_NAME = "digit-entry"
|
_DIGIT_ENTRY_NAME = "digit-entry"
|
||||||
|
|
||||||
def __init__(self, transient, settings, srv_view, fav_view, services, bouquets, new_color, action=Action.EDIT):
|
def __init__(self, app, new_color, action=Action.EDIT):
|
||||||
handlers = {"on_system_changed": self.on_system_changed,
|
handlers = {"on_system_changed": self.on_system_changed,
|
||||||
"on_save": self.on_save,
|
"on_save": self.on_save,
|
||||||
"on_create_new": self.on_create_new,
|
"on_create_new": self.on_create_new,
|
||||||
@@ -76,19 +76,19 @@ class ServiceDetailsDialog:
|
|||||||
|
|
||||||
builder = get_builder(_UI_PATH, handlers, use_str=True)
|
builder = get_builder(_UI_PATH, handlers, use_str=True)
|
||||||
self._builder = builder
|
self._builder = builder
|
||||||
|
settings = app.app_settings
|
||||||
|
|
||||||
self._dialog = builder.get_object("service_details_dialog")
|
self._dialog = builder.get_object("service_details_dialog")
|
||||||
self._dialog.set_transient_for(transient)
|
self._dialog.set_transient_for(app.app_window)
|
||||||
self._s_type = settings.setting_type
|
self._s_type = settings.setting_type
|
||||||
self._tr_type = TrType.Satellite
|
self._tr_type = TrType.Satellite
|
||||||
self._satellites_xml_path = settings.profile_data_path + "satellites.xml"
|
|
||||||
self._picons_path = settings.profile_picons_path
|
self._picons_path = settings.profile_picons_path
|
||||||
self._services_view = srv_view
|
self._services_view = app.services_view
|
||||||
self._fav_view = fav_view
|
self._fav_view = app.fav_view
|
||||||
self._action = action
|
self._action = action
|
||||||
self._old_service = None
|
self._old_service = None
|
||||||
self._services = services
|
self._services = app.current_services
|
||||||
self._bouquets = bouquets
|
self._bouquets = app.current_bouquets
|
||||||
self._new_color = new_color
|
self._new_color = new_color
|
||||||
self._transponder_services_iters = None
|
self._transponder_services_iters = None
|
||||||
self._current_model = None
|
self._current_model = None
|
||||||
|
|||||||
@@ -189,6 +189,7 @@ class ViewTarget(Enum):
|
|||||||
BOUQUET = 0
|
BOUQUET = 0
|
||||||
FAV = 1
|
FAV = 1
|
||||||
SERVICES = 2
|
SERVICES = 2
|
||||||
|
IPTV = 3
|
||||||
|
|
||||||
|
|
||||||
class BqGenType(Enum):
|
class BqGenType(Enum):
|
||||||
@@ -259,6 +260,13 @@ class Column(IntEnum):
|
|||||||
REC_LEN = 3
|
REC_LEN = 3
|
||||||
REC_FILE = 4
|
REC_FILE = 4
|
||||||
REC_DESC = 5
|
REC_DESC = 5
|
||||||
|
# IPTV view
|
||||||
|
IPTV_SERVICE = 0
|
||||||
|
IPTV_TYPE = 1
|
||||||
|
IPTV_PICON = 2
|
||||||
|
IPTV_REF = 3
|
||||||
|
IPTV_FAV_ID = 4
|
||||||
|
IPTV_PICON_ID = 5
|
||||||
|
|
||||||
def __index__(self):
|
def __index__(self):
|
||||||
""" Overridden to get the index in slices directly """
|
""" Overridden to get the index in slices directly """
|
||||||
|
|||||||
Reference in New Issue
Block a user