mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-05-08 23:16:11 +02:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9390aa7be | ||
|
|
e12cc86e5f | ||
|
|
f1ef9fe4aa | ||
|
|
728bfd0b20 | ||
|
|
1d6022b6db | ||
|
|
8609d30ac9 | ||
|
|
fde06dca89 | ||
|
|
e41bf5f58f | ||
|
|
b1488df9ce | ||
|
|
c6e4b3624b | ||
|
|
26b843921b | ||
|
|
e73638d006 |
@@ -5,14 +5,17 @@ Experimental support of Neutrino-MP or others on the same basis (BPanther, etc).
|
|||||||
Focused on the convenience of working in lists from the keyboard. The mouse is also fully supported (Drag and Drop etc)
|
Focused on the convenience of working in lists from the keyboard. The mouse is also fully supported (Drag and Drop etc)
|
||||||
|
|
||||||
Keyboard shortcuts:
|
Keyboard shortcuts:
|
||||||
Ctrl + X, C, V, Up, Down, PageUp, PageDown, S, T, E, L, H, Space; Insert, Delete, F2.
|
Ctrl + X, C, V, Up, Down, PageUp, PageDown, S, T, E, L, H, Space; Insert, Delete, F2.
|
||||||
Insert - copies the selected channels from the main list to the bouquet or inserts (creates) a new bouquet.
|
Insert - copies the selected channels from the main list to the bouquet or inserts (creates) a new bouquet.
|
||||||
Ctrl + X - only in bouquet list. Ctrl + C - only in services list.
|
Ctrl + X - only in bouquet list. Ctrl + C - only in services list.
|
||||||
Clipboard is "rubber". There is an accumulation before the insertion!
|
Clipboard is "rubber". There is an accumulation before the insertion!
|
||||||
Ctrl + E, F2 - edit/rename.
|
Ctrl + E, F2 - edit/rename.
|
||||||
Ctrl + S, T, E in Satellites edit tool for create and edit satellite or transponder.
|
Ctrl + S, T, E in Satellites edit tool for create and edit satellite or transponder.
|
||||||
Ctrl + L - parental lock.
|
Ctrl + L - parental lock.
|
||||||
Ctrl + H - hide/skip.
|
Ctrl + H - hide/skip.
|
||||||
|
Left/Right - remove selection.
|
||||||
|
|
||||||
|
Multiple selections in lists only with Space key (as in file managers)!
|
||||||
|
|
||||||
Extra:
|
Extra:
|
||||||
Ability to import IPTV into bouquet from m3u files(Enigma2 only)!
|
Ability to import IPTV into bouquet from m3u files(Enigma2 only)!
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
""" Module for parsing bouquets """
|
""" Module for parsing bouquets """
|
||||||
from app.eparser.ecommons import BqServiceType, BouquetService, Bouquets, Bouquet
|
from app.eparser.ecommons import BqServiceType, BouquetService, Bouquets, Bouquet
|
||||||
|
|
||||||
_BOUQUETS_PATH = "../data/"
|
|
||||||
_TV_ROOT_FILE_NAME = "bouquets.tv"
|
_TV_ROOT_FILE_NAME = "bouquets.tv"
|
||||||
_RADIO_ROOT_FILE_NAME = "bouquets.radio"
|
_RADIO_ROOT_FILE_NAME = "bouquets.radio"
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ from .blacklist import get_blacklist
|
|||||||
from ..ecommons import Service, POLARIZATION, SYSTEM, FEC, SERVICE_TYPE, FLAG
|
from ..ecommons import Service, POLARIZATION, SYSTEM, FEC, SERVICE_TYPE, FLAG
|
||||||
|
|
||||||
_HEADER = "eDVB services /4/"
|
_HEADER = "eDVB services /4/"
|
||||||
_FILE_PATH = "../data/lamedb"
|
|
||||||
_SEP = ":" # separator
|
_SEP = ":" # separator
|
||||||
_FILE_NAME = "lamedb"
|
_FILE_NAME = "lamedb"
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<property name="icon_name">system-help</property>
|
<property name="icon_name">system-help</property>
|
||||||
<property name="type_hint">normal</property>
|
<property name="type_hint">normal</property>
|
||||||
<property name="program_name">DemonEditor</property>
|
<property name="program_name">DemonEditor</property>
|
||||||
<property name="version">0.2.1 Pre-alpha</property>
|
<property name="version">0.2.2 Pre-alpha</property>
|
||||||
<property name="copyright" translatable="yes">2018 Dmitriy Yefremov
|
<property name="copyright" translatable="yes">2018 Dmitriy Yefremov
|
||||||
dmitry.v.yefremov@gmail.com
|
dmitry.v.yefremov@gmail.com
|
||||||
</property>
|
</property>
|
||||||
@@ -611,7 +611,6 @@ dmitry.v.yefremov@gmail.com
|
|||||||
<property name="value">1</property>
|
<property name="value">1</property>
|
||||||
<property name="step_increment">1</property>
|
<property name="step_increment">1</property>
|
||||||
<property name="page_increment">10</property>
|
<property name="page_increment">10</property>
|
||||||
<property name="page_size">1</property>
|
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkDialog" id="settings_dialog">
|
<object class="GtkDialog" id="settings_dialog">
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ from app.eparser import get_services, get_bouquets, write_bouquets, write_servic
|
|||||||
from app.eparser.ecommons import CAS, FLAG
|
from app.eparser.ecommons import CAS, FLAG
|
||||||
from app.eparser.enigma.bouquets import BqServiceType
|
from app.eparser.enigma.bouquets import BqServiceType
|
||||||
from app.properties import get_config, write_config, Profile
|
from app.properties import get_config, write_config, Profile
|
||||||
from .picons_dialog import PiconsDialog
|
|
||||||
from . import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON
|
from . import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON
|
||||||
from .dialogs import show_dialog, DialogType
|
from .dialogs import show_dialog, DialogType
|
||||||
from .download_dialog import show_download_dialog
|
from .download_dialog import show_download_dialog
|
||||||
from .main_helper import edit_marker, insert_marker, move_items, edit, ViewTarget, set_flags, locate_in_services, \
|
from .main_helper import edit_marker, insert_marker, move_items, edit, ViewTarget, set_flags, locate_in_services, \
|
||||||
scroll_to
|
scroll_to, get_base_model
|
||||||
|
from .picons_dialog import PiconsDialog
|
||||||
from .satellites_dialog import show_satellites_dialog
|
from .satellites_dialog import show_satellites_dialog
|
||||||
from .settings_dialog import show_settings_dialog
|
from .settings_dialog import show_settings_dialog
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ class MainAppWindow:
|
|||||||
_BOUQUETS_LIST_NAME = "bouquets_tree_store"
|
_BOUQUETS_LIST_NAME = "bouquets_tree_store"
|
||||||
# dynamically active elements depending on the selected view
|
# dynamically active elements depending on the selected view
|
||||||
_SERVICE_ELEMENTS = ("copy_tool_button", "to_fav_tool_button", "copy_menu_item", "services_to_fav_move_popup_item",
|
_SERVICE_ELEMENTS = ("copy_tool_button", "to_fav_tool_button", "copy_menu_item", "services_to_fav_move_popup_item",
|
||||||
"services_edit_popup_item", "services_copy_popup_item")
|
"services_edit_popup_item", "services_copy_popup_item", "filter_entry")
|
||||||
|
|
||||||
_BOUQUET_ELEMENTS = ("edit_tool_button", "new_tool_button",
|
_BOUQUET_ELEMENTS = ("edit_tool_button", "new_tool_button",
|
||||||
"bouquets_new_popup_item", "bouquets_edit_popup_item")
|
"bouquets_new_popup_item", "bouquets_edit_popup_item")
|
||||||
@@ -51,7 +51,7 @@ class MainAppWindow:
|
|||||||
"bouquets_remove_popup_item", "fav_remove_popup_item", "hide_tool_button",
|
"bouquets_remove_popup_item", "fav_remove_popup_item", "hide_tool_button",
|
||||||
"import_m3u_tool_button", "fav_import_m3u_popup_item", "fav_insert_marker_popup_item",
|
"import_m3u_tool_button", "fav_import_m3u_popup_item", "fav_insert_marker_popup_item",
|
||||||
"fav_edit_marker_popup_item", "fav_edit_popup_item", "fav_locate_popup_item",
|
"fav_edit_marker_popup_item", "fav_edit_popup_item", "fav_locate_popup_item",
|
||||||
"services_copy_popup_item")
|
"services_copy_popup_item", "filter_entry")
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
handlers = {"on_close_main_window": self.on_quit,
|
handlers = {"on_close_main_window": self.on_quit,
|
||||||
@@ -90,16 +90,17 @@ class MainAppWindow:
|
|||||||
"on_edit_marker": self.on_edit_marker,
|
"on_edit_marker": self.on_edit_marker,
|
||||||
"on_fav_popup": self.on_fav_popup,
|
"on_fav_popup": self.on_fav_popup,
|
||||||
"on_locate_in_services": self.on_locate_in_services,
|
"on_locate_in_services": self.on_locate_in_services,
|
||||||
"on_picons_loader_show": self.on_picons_loader_show}
|
"on_picons_loader_show": self.on_picons_loader_show,
|
||||||
|
"on_filter_changed": self.on_filter_changed}
|
||||||
|
|
||||||
self.__options = get_config()
|
self.__options = get_config()
|
||||||
self.__profile = self.__options.get("profile")
|
self.__profile = self.__options.get("profile")
|
||||||
|
os.makedirs(os.path.dirname(self.__options.get(self.__profile).get("data_dir_path")), exist_ok=True)
|
||||||
# Used for copy/paste. When adding the previous data will not be deleted.
|
# Used for copy/paste. When adding the previous data will not be deleted.
|
||||||
# Clearing only after the insertion!
|
# Clearing only after the insertion!
|
||||||
self.__rows_buffer = []
|
self.__rows_buffer = []
|
||||||
self.__services = {}
|
self.__services = {}
|
||||||
self.__bouquets = {}
|
self.__bouquets = {}
|
||||||
self.__bouquets_to_del = []
|
|
||||||
self.__blacklist = set()
|
self.__blacklist = set()
|
||||||
|
|
||||||
builder = Gtk.Builder()
|
builder = Gtk.Builder()
|
||||||
@@ -129,7 +130,14 @@ class MainAppWindow:
|
|||||||
self.__radio_count_label = builder.get_object("radio_count_label")
|
self.__radio_count_label = builder.get_object("radio_count_label")
|
||||||
self.__data_count_label = builder.get_object("data_count_label")
|
self.__data_count_label = builder.get_object("data_count_label")
|
||||||
self.__fav_edit_marker_popup_item = builder.get_object("fav_edit_marker_popup_item")
|
self.__fav_edit_marker_popup_item = builder.get_object("fav_edit_marker_popup_item")
|
||||||
|
# Filter
|
||||||
|
self.__services_model_filter = builder.get_object("services_model_filter")
|
||||||
|
self.__services_model_filter.set_visible_func(self.services_filter_function)
|
||||||
|
self.__filter_entry = builder.get_object("filter_entry")
|
||||||
self.init_drag_and_drop() # drag and drop
|
self.init_drag_and_drop() # drag and drop
|
||||||
|
# Force ctrl press event for view. Multiple selections in lists only with Space key(as in file managers)!!!
|
||||||
|
self.__services_view.connect("key-press-event", self.force_ctrl)
|
||||||
|
self.__fav_view.connect("key-press-event", self.force_ctrl)
|
||||||
self.__main_window.show()
|
self.__main_window.show()
|
||||||
|
|
||||||
def init_drag_and_drop(self):
|
def init_drag_and_drop(self):
|
||||||
@@ -146,6 +154,10 @@ class MainAppWindow:
|
|||||||
self.__services_view.drag_source_set_target_list(None)
|
self.__services_view.drag_source_set_target_list(None)
|
||||||
self.__services_view.drag_source_add_text_targets()
|
self.__services_view.drag_source_add_text_targets()
|
||||||
|
|
||||||
|
def force_ctrl(self, view, event):
|
||||||
|
""" Function for force ctrl press event for view """
|
||||||
|
event.state |= Gdk.ModifierType.CONTROL_MASK
|
||||||
|
|
||||||
def on_quit(self, *args):
|
def on_quit(self, *args):
|
||||||
""" Called before app quit """
|
""" Called before app quit """
|
||||||
write_config(self.__options) # storing current config
|
write_config(self.__options) # storing current config
|
||||||
@@ -210,7 +222,8 @@ class MainAppWindow:
|
|||||||
self.on_view_focus(view, None)
|
self.on_view_focus(view, None)
|
||||||
|
|
||||||
def on_edit(self, view):
|
def on_edit(self, view):
|
||||||
name = view.get_model().get_name()
|
model = get_base_model(view.get_model())
|
||||||
|
name = model.get_name()
|
||||||
if name == self._BOUQUETS_LIST_NAME:
|
if name == self._BOUQUETS_LIST_NAME:
|
||||||
self.on_bouquets_edit(view)
|
self.on_bouquets_edit(view)
|
||||||
# edit(view, self.__main_window, ViewTarget.BOUQUET)
|
# edit(view, self.__main_window, ViewTarget.BOUQUET)
|
||||||
@@ -228,36 +241,41 @@ class MainAppWindow:
|
|||||||
if view.is_focus():
|
if view.is_focus():
|
||||||
selection = view.get_selection()
|
selection = view.get_selection()
|
||||||
model, paths = selection.get_selected_rows()
|
model, paths = selection.get_selected_rows()
|
||||||
model_name = model.get_name()
|
model_name = get_base_model(model).get_name()
|
||||||
itrs = [model.get_iter(path) for path in paths]
|
itrs = [model.get_iter(path) for path in paths]
|
||||||
rows = [model.get(in_itr, *[x for x in range(model.get_n_columns())]) for in_itr in itrs]
|
rows = [model[in_itr][:] for in_itr in itrs]
|
||||||
bq_selected = self.is_bouquet_selected()
|
bq_selected = self.is_bouquet_selected()
|
||||||
fav_bouquet = None
|
fav_bouquet = None
|
||||||
|
|
||||||
if bq_selected:
|
if bq_selected:
|
||||||
fav_bouquet = self.__bouquets.get(bq_selected, None)
|
fav_bouquet = self.__bouquets.get(bq_selected, None)
|
||||||
|
|
||||||
for itr in itrs:
|
|
||||||
if fav_bouquet and model_name == self._FAV_LIST_NAME:
|
|
||||||
del fav_bouquet[int(model.get_path(itr)[0])]
|
|
||||||
if model_name == self._BOUQUETS_LIST_NAME:
|
|
||||||
if len(model.get_path(itr)) < 2:
|
|
||||||
show_dialog(DialogType.ERROR, self.__main_window, "This item is not allowed to be removed!")
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
self.delete_bouquet(bq_selected)
|
|
||||||
model.remove(itr)
|
|
||||||
if model_name == self._FAV_LIST_NAME:
|
if model_name == self._FAV_LIST_NAME:
|
||||||
self.update_fav_num_column(model)
|
self.remove_favs(fav_bouquet, itrs, model)
|
||||||
|
elif model_name == self._BOUQUETS_LIST_NAME:
|
||||||
|
self.delete_bouquets(itrs, model, bq_selected)
|
||||||
elif model_name == self._SERVICE_LIST_NAME:
|
elif model_name == self._SERVICE_LIST_NAME:
|
||||||
self.delete_services(bq_selected, rows)
|
self.delete_services(bq_selected, itrs, model, rows)
|
||||||
|
|
||||||
self.on_view_focus(view, None)
|
self.on_view_focus(view, None)
|
||||||
|
|
||||||
return rows
|
return rows
|
||||||
|
|
||||||
def delete_services(self, bq_selected, rows):
|
def remove_favs(self, fav_bouquet, itrs, model):
|
||||||
|
""" Deleting bouquet services """
|
||||||
|
if fav_bouquet:
|
||||||
|
for itr in itrs:
|
||||||
|
del fav_bouquet[int(model.get_path(itr)[0])]
|
||||||
|
self.__fav_model.remove(itr)
|
||||||
|
self.update_fav_num_column(model)
|
||||||
|
|
||||||
|
def delete_services(self, bq_selected, itrs, model, rows):
|
||||||
""" Deleting services """
|
""" Deleting services """
|
||||||
|
srv_itrs = [self.__services_model_filter.convert_iter_to_child_iter(
|
||||||
|
model.convert_iter_to_child_iter(itr)) for itr in itrs]
|
||||||
|
for s_itr in srv_itrs:
|
||||||
|
self.__services_model.remove(s_itr)
|
||||||
|
|
||||||
for row in rows:
|
for row in rows:
|
||||||
# There are channels with the same parameters except for the name.
|
# There are channels with the same parameters except for the name.
|
||||||
# None because it can have duplicates! Need fix
|
# None because it can have duplicates! Need fix
|
||||||
@@ -273,13 +291,16 @@ class MainAppWindow:
|
|||||||
if bq_selected:
|
if bq_selected:
|
||||||
self.update_bouquet_channels(self.__fav_model, None, bq_selected)
|
self.update_bouquet_channels(self.__fav_model, None, bq_selected)
|
||||||
|
|
||||||
def delete_bouquet(self, bouquet):
|
def delete_bouquets(self, itrs, model, bouquet):
|
||||||
""" Deleting bouquet """
|
""" Deleting bouquets """
|
||||||
self.__bouquets.pop(bouquet)
|
for itr in itrs:
|
||||||
self.__fav_model.clear()
|
if len(model.get_path(itr)) < 2:
|
||||||
profile = Profile(self.__profile)
|
show_dialog(DialogType.ERROR, self.__main_window, "This item is not allowed to be removed!")
|
||||||
if profile is Profile.ENIGMA_2:
|
return
|
||||||
self.__bouquets_to_del.append(self.get_bouquet_file_name(bouquet))
|
else:
|
||||||
|
self.__bouquets.pop(bouquet)
|
||||||
|
self.__fav_model.clear()
|
||||||
|
self.__bouquets_model.remove(itr)
|
||||||
|
|
||||||
def get_bouquet_file_name(self, bouquet):
|
def get_bouquet_file_name(self, bouquet):
|
||||||
bouquet_file_name = "{}userbouquet.{}.{}".format(self.__options.get(self.__profile).get("data_dir_path"),
|
bouquet_file_name = "{}userbouquet.{}.{}".format(self.__options.get(self.__profile).get("data_dir_path"),
|
||||||
@@ -292,7 +313,8 @@ class MainAppWindow:
|
|||||||
|
|
||||||
if paths:
|
if paths:
|
||||||
itr = model.get_iter(paths[0])
|
itr = model.get_iter(paths[0])
|
||||||
bq_type = model.get_value(itr, 1)
|
bq_type = model.get_value(itr, 3)
|
||||||
|
|
||||||
bq_name = "bouquet"
|
bq_name = "bouquet"
|
||||||
count = 0
|
count = 0
|
||||||
key = "{}:{}".format(bq_name, bq_type)
|
key = "{}:{}".format(bq_name, bq_type)
|
||||||
@@ -340,14 +362,11 @@ class MainAppWindow:
|
|||||||
itr = model.get_iter(paths[0])
|
itr = model.get_iter(paths[0])
|
||||||
bq_name, bq_type = model.get(itr, 0, 3)
|
bq_name, bq_type = model.get(itr, 0, 3)
|
||||||
response = show_dialog(DialogType.INPUT, self.__main_window, bq_name)
|
response = show_dialog(DialogType.INPUT, self.__main_window, bq_name)
|
||||||
|
|
||||||
if response == Gtk.ResponseType.CANCEL:
|
if response == Gtk.ResponseType.CANCEL:
|
||||||
return
|
return
|
||||||
|
|
||||||
model.set_value(itr, 0, response)
|
model.set_value(itr, 0, response)
|
||||||
self.__bouquets["{}:{}".format(response, bq_type)] = self.__bouquets.pop("{}:{}".format(bq_name, bq_type))
|
self.__bouquets["{}:{}".format(response, bq_type)] = self.__bouquets.pop("{}:{}".format(bq_name, bq_type))
|
||||||
if Profile(self.__profile) is Profile.ENIGMA_2:
|
|
||||||
self.__bouquets_to_del.append(self.get_bouquet_file_name(bq_selected))
|
|
||||||
|
|
||||||
def on_to_fav_move(self, view):
|
def on_to_fav_move(self, view):
|
||||||
""" Move items from app to fav list """
|
""" Move items from app to fav list """
|
||||||
@@ -359,6 +378,8 @@ class MainAppWindow:
|
|||||||
def get_selection(self, view):
|
def get_selection(self, view):
|
||||||
""" Creates a string from the iterators of the selected rows """
|
""" Creates a string from the iterators of the selected rows """
|
||||||
model, paths = view.get_selection().get_selected_rows()
|
model, paths = view.get_selection().get_selected_rows()
|
||||||
|
if model.get_model(): # needs think about it !
|
||||||
|
model = model.get_model().get_model()
|
||||||
|
|
||||||
if len(paths) > 0:
|
if len(paths) > 0:
|
||||||
itrs = [model.get_iter(path) for path in paths]
|
itrs = [model.get_iter(path) for path in paths]
|
||||||
@@ -372,7 +393,7 @@ class MainAppWindow:
|
|||||||
show_dialog(DialogType.ERROR, self.__main_window, "Error. No bouquet is selected!")
|
show_dialog(DialogType.ERROR, self.__main_window, "Error. No bouquet is selected!")
|
||||||
return
|
return
|
||||||
|
|
||||||
model = view.get_model()
|
model = get_base_model(view.get_model())
|
||||||
dest_index = 0
|
dest_index = 0
|
||||||
|
|
||||||
if drop_info:
|
if drop_info:
|
||||||
@@ -390,8 +411,7 @@ class MainAppWindow:
|
|||||||
if source == self._SERVICE_LIST_NAME:
|
if source == self._SERVICE_LIST_NAME:
|
||||||
ext_model = self.__services_view.get_model()
|
ext_model = self.__services_view.get_model()
|
||||||
ext_itrs = [ext_model.get_iter_from_string(itr) for itr in itrs]
|
ext_itrs = [ext_model.get_iter_from_string(itr) for itr in itrs]
|
||||||
ext_rows = [ext_model.get(ext_itr, *[x for x in range(ext_model.get_n_columns())]) for
|
ext_rows = [ext_model[ext_itr][:] for ext_itr in ext_itrs]
|
||||||
ext_itr in ext_itrs]
|
|
||||||
dest_index -= 1
|
dest_index -= 1
|
||||||
for ext_row in ext_rows:
|
for ext_row in ext_rows:
|
||||||
dest_index += 1
|
dest_index += 1
|
||||||
@@ -402,7 +422,7 @@ class MainAppWindow:
|
|||||||
fav_bouquet.insert(dest_index, channel.fav_id)
|
fav_bouquet.insert(dest_index, channel.fav_id)
|
||||||
elif source == self._FAV_LIST_NAME:
|
elif source == self._FAV_LIST_NAME:
|
||||||
in_itrs = [model.get_iter_from_string(itr) for itr in itrs]
|
in_itrs = [model.get_iter_from_string(itr) for itr in itrs]
|
||||||
in_rows = [model.get(in_itr, *[x for x in range(model.get_n_columns())]) for in_itr in in_itrs]
|
in_rows = [model[in_itr][:] for in_itr in in_itrs]
|
||||||
for row in in_rows:
|
for row in in_rows:
|
||||||
model.insert(dest_index, row)
|
model.insert(dest_index, row)
|
||||||
fav_bouquet.insert(dest_index, row[4])
|
fav_bouquet.insert(dest_index, row[4])
|
||||||
@@ -517,29 +537,32 @@ class MainAppWindow:
|
|||||||
self.__services.clear()
|
self.__services.clear()
|
||||||
self.__rows_buffer.clear()
|
self.__rows_buffer.clear()
|
||||||
self.__bouquets.clear()
|
self.__bouquets.clear()
|
||||||
self.__bouquets_to_del.clear()
|
|
||||||
|
|
||||||
def on_data_save(self, *args):
|
def on_data_save(self, *args):
|
||||||
if show_dialog(DialogType.QUESTION, self.__main_window) == Gtk.ResponseType.CANCEL:
|
if show_dialog(DialogType.QUESTION, self.__main_window) == Gtk.ResponseType.CANCEL:
|
||||||
return
|
return
|
||||||
|
|
||||||
path = self.__options.get(self.__profile).get("data_dir_path")
|
path = self.__options.get(self.__profile).get("data_dir_path")
|
||||||
|
# deleting files in data dir(skipping dirs) :)
|
||||||
|
list(map(os.unlink, (os.path.join(path, f) for f in filter(
|
||||||
|
lambda f: f != "satellites.xml" and os.path.isfile(os.path.join(path, f)), os.listdir(path)))))
|
||||||
|
|
||||||
bouquets = []
|
bouquets = []
|
||||||
services_model = self.__services_view.get_model()
|
services_model = self.__services_view.get_model()
|
||||||
|
|
||||||
def parse_bouquets(model, b_path, itr):
|
def parse_bouquets(model, b_path, itr):
|
||||||
|
bqs = None
|
||||||
if model.iter_has_child(itr):
|
if model.iter_has_child(itr):
|
||||||
num_of_children = model.iter_n_children(itr)
|
|
||||||
bqs = []
|
bqs = []
|
||||||
|
num_of_children = model.iter_n_children(itr)
|
||||||
for num in range(num_of_children):
|
for num in range(num_of_children):
|
||||||
bq_itr = model.iter_nth_child(itr, num)
|
bq_itr = model.iter_nth_child(itr, num)
|
||||||
bq_name, locked, hidden, bq_type = model.get(bq_itr, 0, 1, 2, 3)
|
bq_name, locked, hidden, bq_type = model.get(bq_itr, 0, 1, 2, 3)
|
||||||
favs = self.__bouquets["{}:{}".format(bq_name, bq_type)]
|
favs = self.__bouquets["{}:{}".format(bq_name, bq_type)]
|
||||||
bq = Bouquet(bq_name, bq_type, [self.__services.get(f_id, None) for f_id in favs], locked, hidden)
|
bq = Bouquet(bq_name, bq_type, [self.__services.get(f_id, None) for f_id in favs], locked, hidden)
|
||||||
bqs.append(bq)
|
bqs.append(bq)
|
||||||
bqs = Bouquets(*model.get(itr, 0, 3), bqs)
|
if len(b_path) == 1:
|
||||||
bouquets.append(bqs)
|
bouquets.append(Bouquets(*model.get(itr, 0, 3), bqs if bqs else []))
|
||||||
|
|
||||||
profile = Profile(self.__profile)
|
profile = Profile(self.__profile)
|
||||||
# Getting bouquets
|
# Getting bouquets
|
||||||
@@ -550,10 +573,6 @@ class MainAppWindow:
|
|||||||
write_services(path, services, profile)
|
write_services(path, services, profile)
|
||||||
# removing bouquet files
|
# removing bouquet files
|
||||||
if profile is profile.ENIGMA_2:
|
if profile is profile.ENIGMA_2:
|
||||||
for bqf in self.__bouquets_to_del:
|
|
||||||
with suppress(FileNotFoundError):
|
|
||||||
os.remove(bqf)
|
|
||||||
self.__bouquets_to_del.clear()
|
|
||||||
# blacklist
|
# blacklist
|
||||||
write_blacklist(path, self.__blacklist)
|
write_blacklist(path, self.__blacklist)
|
||||||
|
|
||||||
@@ -634,7 +653,8 @@ class MainAppWindow:
|
|||||||
key = event.keyval
|
key = event.keyval
|
||||||
ctrl = event.state & Gdk.ModifierType.CONTROL_MASK
|
ctrl = event.state & Gdk.ModifierType.CONTROL_MASK
|
||||||
alt = event.state & Gdk.ModifierType.MOD1_MASK
|
alt = event.state & Gdk.ModifierType.MOD1_MASK
|
||||||
model_name = view.get_model().get_name()
|
model = get_base_model(view.get_model())
|
||||||
|
model_name = model.get_name()
|
||||||
|
|
||||||
if key == Gdk.KEY_Delete:
|
if key == Gdk.KEY_Delete:
|
||||||
self.on_delete(view)
|
self.on_delete(view)
|
||||||
@@ -643,7 +663,7 @@ class MainAppWindow:
|
|||||||
elif ctrl and key in (Gdk.KEY_Down, Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Down):
|
elif ctrl and key in (Gdk.KEY_Down, Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Down):
|
||||||
self.move_items(key)
|
self.move_items(key)
|
||||||
elif model_name == self._FAV_LIST_NAME and key == Gdk.KEY_Control_L or key == Gdk.KEY_Control_R:
|
elif model_name == self._FAV_LIST_NAME and key == Gdk.KEY_Control_L or key == Gdk.KEY_Control_R:
|
||||||
self.update_fav_num_column(view.get_model())
|
self.update_fav_num_column(model)
|
||||||
self.update_bouquet_list()
|
self.update_bouquet_list()
|
||||||
elif key == Gdk.KEY_Insert:
|
elif key == Gdk.KEY_Insert:
|
||||||
# Move items from app to fav list
|
# Move items from app to fav list
|
||||||
@@ -668,6 +688,8 @@ class MainAppWindow:
|
|||||||
self.on_edit(view)
|
self.on_edit(view)
|
||||||
elif key == Gdk.KEY_space and model_name == self._FAV_LIST_NAME:
|
elif key == Gdk.KEY_space and model_name == self._FAV_LIST_NAME:
|
||||||
pass
|
pass
|
||||||
|
elif key == Gdk.KEY_Left or key == Gdk.KEY_Right:
|
||||||
|
view.do_unselect_all(view)
|
||||||
|
|
||||||
def on_download(self, item):
|
def on_download(self, item):
|
||||||
show_download_dialog(transient=self.__main_window,
|
show_download_dialog(transient=self.__main_window,
|
||||||
@@ -678,7 +700,7 @@ class MainAppWindow:
|
|||||||
@run_idle
|
@run_idle
|
||||||
def on_view_focus(self, view, focus_event):
|
def on_view_focus(self, view, focus_event):
|
||||||
profile = Profile(self.__profile)
|
profile = Profile(self.__profile)
|
||||||
model = view.get_model()
|
model = get_base_model(view.get_model())
|
||||||
model_name = model.get_name()
|
model_name = model.get_name()
|
||||||
not_empty = len(model) > 0 # if > 0 model has items
|
not_empty = len(model) > 0 # if > 0 model has items
|
||||||
|
|
||||||
@@ -810,6 +832,16 @@ class MainAppWindow:
|
|||||||
dialog = PiconsDialog(self.__main_window, self.__options.get(self.__profile), Profile(self.__profile))
|
dialog = PiconsDialog(self.__main_window, self.__options.get(self.__profile), Profile(self.__profile))
|
||||||
dialog.show()
|
dialog.show()
|
||||||
|
|
||||||
|
@run_idle
|
||||||
|
def on_filter_changed(self, entry):
|
||||||
|
self.__services_model_filter.refilter()
|
||||||
|
|
||||||
|
def services_filter_function(self, model, iter, data):
|
||||||
|
if self.__services_model_filter is None or self.__services_model_filter == "None":
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return self.__filter_entry.get_text() in str(model.get(iter, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14))
|
||||||
|
|
||||||
|
|
||||||
def start_app():
|
def start_app():
|
||||||
MainAppWindow()
|
MainAppWindow()
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ def move_items(key, view):
|
|||||||
|
|
||||||
def edit(view, parent_window, target, fav_view=None, service_view=None, channels=None):
|
def edit(view, parent_window, target, fav_view=None, service_view=None, channels=None):
|
||||||
model, paths = view.get_selection().get_selected_rows()
|
model, paths = view.get_selection().get_selected_rows()
|
||||||
|
model = get_base_model(model)
|
||||||
|
|
||||||
if not paths:
|
if not paths:
|
||||||
return
|
return
|
||||||
@@ -157,16 +158,18 @@ def set_flags(flag, services_view, fav_view, channels, blacklist):
|
|||||||
if not paths:
|
if not paths:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
model = get_base_model(model)
|
||||||
|
|
||||||
if flag is FLAG.HIDE:
|
if flag is FLAG.HIDE:
|
||||||
if target is ViewTarget.SERVICES:
|
if target is ViewTarget.SERVICES:
|
||||||
set_hide(channels, model, paths)
|
set_hide(channels, model, paths)
|
||||||
else:
|
else:
|
||||||
fav_ids = [model.get_value(model.get_iter(path), 7) for path in paths]
|
fav_ids = [model.get_value(model.get_iter(path), 7) for path in paths]
|
||||||
srv_model = services_view.get_model()
|
srv_model = get_base_model(services_view.get_model())
|
||||||
srv_paths = [row.path for row in srv_model if row[16] in fav_ids]
|
srv_paths = [row.path for row in srv_model if row[16] in fav_ids]
|
||||||
set_hide(channels, srv_model, srv_paths)
|
set_hide(channels, srv_model, srv_paths)
|
||||||
elif flag is FLAG.LOCK:
|
elif flag is FLAG.LOCK:
|
||||||
set_lock(blacklist, channels, model, paths, target, services_model=services_view.get_model())
|
set_lock(blacklist, channels, model, paths, target, services_model=get_base_model(services_view.get_model()))
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -283,5 +286,12 @@ def update_entry_data(entry, dialog, options):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def get_base_model(model):
|
||||||
|
""" Returns base tree model if has wrappers ("TreeModelSort" and "TreeModelFilter") """
|
||||||
|
if type(model) is Gtk.TreeModelSort:
|
||||||
|
return model.get_model().get_model()
|
||||||
|
return model
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -270,6 +270,12 @@
|
|||||||
</columns>
|
</columns>
|
||||||
<signal name="row-deleted" handler="on_model_changed" swapped="no"/>
|
<signal name="row-deleted" handler="on_model_changed" swapped="no"/>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkTreeModelFilter" id="services_model_filter">
|
||||||
|
<property name="child_model">services_list_store</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkTreeModelSort" id="services_model_tree_model_sort">
|
||||||
|
<property name="model">services_model_filter</property>
|
||||||
|
</object>
|
||||||
<object class="GtkApplicationWindow" id="main_window">
|
<object class="GtkApplicationWindow" id="main_window">
|
||||||
<property name="width_request">640</property>
|
<property name="width_request">640</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
@@ -547,6 +553,38 @@
|
|||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparatorToolItem" id="separatortoolitem8">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkToolItem" id="filter_tool_item">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="filter_entry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Services filter</property>
|
||||||
|
<property name="primary_icon_name">edit-select-all-symbolic</property>
|
||||||
|
<property name="primary_icon_activatable">False</property>
|
||||||
|
<property name="primary_icon_tooltip_text" translatable="yes">Services filter</property>
|
||||||
|
<signal name="changed" handler="on_filter_changed" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorToolItem" id="toolbutton4">
|
<object class="GtkSeparatorToolItem" id="toolbutton4">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@@ -893,7 +931,7 @@
|
|||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="padding">2</property>
|
<property name="padding">2</property>
|
||||||
<property name="position">2</property>
|
<property name="position">3</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -901,8 +939,8 @@
|
|||||||
<property name="height_request">250</property>
|
<property name="height_request">250</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="margin_left">2</property>
|
<property name="margin_left">1</property>
|
||||||
<property name="margin_right">2</property>
|
<property name="margin_right">1</property>
|
||||||
<property name="wide_handle">True</property>
|
<property name="wide_handle">True</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="box4">
|
<object class="GtkBox" id="box4">
|
||||||
@@ -925,12 +963,13 @@
|
|||||||
<object class="GtkScrolledWindow" id="services_scrolled_window">
|
<object class="GtkScrolledWindow" id="services_scrolled_window">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
<property name="margin_bottom">2</property>
|
||||||
<property name="shadow_type">in</property>
|
<property name="shadow_type">in</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeView" id="services_tree_view">
|
<object class="GtkTreeView" id="services_tree_view">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="model">services_list_store</property>
|
<property name="model">services_model_tree_model_sort</property>
|
||||||
<property name="search_column">3</property>
|
<property name="search_column">3</property>
|
||||||
<property name="rubber_banding">True</property>
|
<property name="rubber_banding">True</property>
|
||||||
<property name="enable_grid_lines">both</property>
|
<property name="enable_grid_lines">both</property>
|
||||||
@@ -973,6 +1012,7 @@
|
|||||||
<object class="GtkTreeViewColumn" id="service_column">
|
<object class="GtkTreeViewColumn" id="service_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
|
<property name="min_width">50</property>
|
||||||
<property name="title" translatable="yes">Service</property>
|
<property name="title" translatable="yes">Service</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1006,7 +1046,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="package_column">
|
<object class="GtkTreeViewColumn" id="package_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
<property name="sizing">autosize</property>
|
<property name="min_width">50</property>
|
||||||
<property name="title" translatable="yes">Package</property>
|
<property name="title" translatable="yes">Package</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1022,6 +1062,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="service_type_column">
|
<object class="GtkTreeViewColumn" id="service_type_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">Type</property>
|
<property name="title" translatable="yes">Type</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1039,6 +1080,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="ssid_column">
|
<object class="GtkTreeViewColumn" id="ssid_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">Ssid</property>
|
<property name="title" translatable="yes">Ssid</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1056,6 +1098,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="freq_column">
|
<object class="GtkTreeViewColumn" id="freq_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">Freq</property>
|
<property name="title" translatable="yes">Freq</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1073,6 +1116,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="rate_column">
|
<object class="GtkTreeViewColumn" id="rate_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">Rate</property>
|
<property name="title" translatable="yes">Rate</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1090,6 +1134,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="pol_column">
|
<object class="GtkTreeViewColumn" id="pol_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">Pol</property>
|
<property name="title" translatable="yes">Pol</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1107,6 +1152,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="fec_column">
|
<object class="GtkTreeViewColumn" id="fec_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">FEC</property>
|
<property name="title" translatable="yes">FEC</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1124,6 +1170,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="system_column">
|
<object class="GtkTreeViewColumn" id="system_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">System</property>
|
<property name="title" translatable="yes">System</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="reorderable">True</property>
|
<property name="reorderable">True</property>
|
||||||
@@ -1141,6 +1188,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="pos_column">
|
<object class="GtkTreeViewColumn" id="pos_column">
|
||||||
<property name="resizable">True</property>
|
<property name="resizable">True</property>
|
||||||
|
<property name="min_width">25</property>
|
||||||
<property name="title" translatable="yes">Pos</property>
|
<property name="title" translatable="yes">Pos</property>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="sort_column_id">14</property>
|
<property name="sort_column_id">14</property>
|
||||||
@@ -1201,7 +1249,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="services_bar_box">
|
<object class="GtkBox" id="services_bar_box">
|
||||||
<property name="height_request">25</property>
|
<property name="height_request">20</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="resize_mode">queue</property>
|
<property name="resize_mode">queue</property>
|
||||||
@@ -1224,12 +1272,14 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="tooltip_text" translatable="yes">CAS</property>
|
<property name="tooltip_text" translatable="yes">CAS</property>
|
||||||
<property name="width_chars">10</property>
|
<property name="width_chars">20</property>
|
||||||
|
<property name="max_width_chars">20</property>
|
||||||
<property name="xalign">0</property>
|
<property name="xalign">0</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
|
<property name="padding">2</property>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
@@ -1323,6 +1373,19 @@
|
|||||||
<property name="position">8</property>
|
<property name="position">8</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparator" id="separator2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="padding">5</property>
|
||||||
|
<property name="position">9</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
@@ -1362,6 +1425,7 @@
|
|||||||
<object class="GtkScrolledWindow" id="scrolledwindow2">
|
<object class="GtkScrolledWindow" id="scrolledwindow2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
<property name="margin_bottom">2</property>
|
||||||
<property name="shadow_type">in</property>
|
<property name="shadow_type">in</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeView" id="fav_tree_view">
|
<object class="GtkTreeView" id="fav_tree_view">
|
||||||
@@ -1482,7 +1546,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="fav_bar_box">
|
<object class="GtkBox" id="fav_bar_box">
|
||||||
<property name="height_request">25</property>
|
<property name="height_request">20</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
@@ -1503,7 +1567,8 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">0</property>
|
<property name="label" translatable="yes">0</property>
|
||||||
<property name="width_chars">10</property>
|
<property name="width_chars">15</property>
|
||||||
|
<property name="max_width_chars">15</property>
|
||||||
<property name="xalign">0</property>
|
<property name="xalign">0</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -1549,6 +1614,7 @@
|
|||||||
<object class="GtkScrolledWindow" id="scrolledwindow3">
|
<object class="GtkScrolledWindow" id="scrolledwindow3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
<property name="margin_bottom">2</property>
|
||||||
<property name="shadow_type">in</property>
|
<property name="shadow_type">in</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeView" id="bouquets_tree_view">
|
<object class="GtkTreeView" id="bouquets_tree_view">
|
||||||
@@ -1619,7 +1685,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="bouquet_bar_box">
|
<object class="GtkBox" id="bouquet_bar_box">
|
||||||
<property name="height_request">25</property>
|
<property name="height_request">20</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
@@ -1640,7 +1706,8 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">0</property>
|
<property name="label" translatable="yes">0</property>
|
||||||
<property name="width_chars">5</property>
|
<property name="width_chars">10</property>
|
||||||
|
<property name="max_width_chars">10</property>
|
||||||
<property name="xalign">0</property>
|
<property name="xalign">0</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -1676,7 +1743,7 @@
|
|||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="padding">1</property>
|
<property name="padding">1</property>
|
||||||
<property name="position">3</property>
|
<property name="position">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -1689,7 +1756,7 @@
|
|||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="padding">2</property>
|
<property name="padding">2</property>
|
||||||
<property name="position">4</property>
|
<property name="position">5</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -1698,8 +1765,6 @@
|
|||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="margin_start">10</property>
|
<property name="margin_start">10</property>
|
||||||
<property name="margin_end">10</property>
|
<property name="margin_end">10</property>
|
||||||
<property name="margin_top">6</property>
|
|
||||||
<property name="margin_bottom">6</property>
|
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -1742,7 +1807,7 @@
|
|||||||
<object class="GtkLabel" id="ver_label">
|
<object class="GtkLabel" id="ver_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">Ver. 0.2.1 Pre-alpha</property>
|
<property name="label" translatable="yes">Ver. 0.2.2 Pre-alpha</property>
|
||||||
<property name="xalign">0.94999998807907104</property>
|
<property name="xalign">0.94999998807907104</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -1755,7 +1820,7 @@
|
|||||||
<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">5</property>
|
<property name="position">7</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
@@ -153,55 +153,175 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="format_box">
|
<object class="GtkGrid" id="format_box">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="spacing">5</property>
|
<property name="column_spacing">2</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="label1">
|
<object class="GtkBox" id="name_format_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Picons name format:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="box2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="margin_right">5</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="enigma2_radio_button">
|
||||||
|
<property name="label" translatable="yes">Enigma2 (default)</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<property name="group">neutrino_mp_radio_button</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="neutrino_mp_radio_button">
|
||||||
|
<property name="label" translatable="yes">Neutrino-MP</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<property name="group">enigma2_radio_button</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</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">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="resize_format_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Resize: </property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="resize_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="resize_no_radio_button">
|
||||||
|
<property name="label" translatable="yes">No(default)</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<property name="group">resize_100_60_radio_button</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="resize_220_132_radio_button">
|
||||||
|
<property name="label" translatable="yes">220x132</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<property name="group">resize_100_60_radio_button</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="resize_100_60_radio_button">
|
||||||
|
<property name="label" translatable="yes">100x60</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<property name="group">resize_no_radio_button</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">2</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparator" id="separator3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="margin_left">5</property>
|
<property name="margin_left">5</property>
|
||||||
<property name="label" translatable="yes">Picons name format:</property>
|
<property name="margin_right">5</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="left_attach">1</property>
|
||||||
<property name="fill">True</property>
|
<property name="top_attach">0</property>
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkRadioButton" id="enigma2_radio_button">
|
|
||||||
<property name="label" translatable="yes">Enigma2 (default)</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">False</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="active">True</property>
|
|
||||||
<property name="draw_indicator">True</property>
|
|
||||||
<property name="group">neutrino_mp_radio_button</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkRadioButton" id="neutrino_mp_radio_button">
|
|
||||||
<property name="label" translatable="yes">Neutrino-MP</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">False</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="active">True</property>
|
|
||||||
<property name="draw_indicator">True</property>
|
|
||||||
<property name="group">enigma2_radio_button</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">2</property>
|
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<style>
|
<style>
|
||||||
@@ -210,7 +330,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">False</property>
|
||||||
<property name="position">3</property>
|
<property name="position">3</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ class PiconsDialog:
|
|||||||
self._receive_tool_button = builder.get_object("receive_tool_button")
|
self._receive_tool_button = builder.get_object("receive_tool_button")
|
||||||
self._enigma2_radio_button = builder.get_object("enigma2_radio_button")
|
self._enigma2_radio_button = builder.get_object("enigma2_radio_button")
|
||||||
self._neutrino_mp_radio_button = builder.get_object("neutrino_mp_radio_button")
|
self._neutrino_mp_radio_button = builder.get_object("neutrino_mp_radio_button")
|
||||||
|
self._resize_no_radio_button = builder.get_object("resize_no_radio_button")
|
||||||
|
self._resize_220_132_radio_button = builder.get_object("resize_220_132_radio_button")
|
||||||
|
self._resize_100_60_radio_button = builder.get_object("resize_100_60_radio_button")
|
||||||
# style
|
# style
|
||||||
self._style_provider = Gtk.CssProvider()
|
self._style_provider = Gtk.CssProvider()
|
||||||
self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css")
|
self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css")
|
||||||
@@ -127,6 +130,7 @@ class PiconsDialog:
|
|||||||
self._current_process.wait()
|
self._current_process.wait()
|
||||||
path = self._TMP_DIR + self._BASE_URL + url[url.rfind("/") + 1:]
|
path = self._TMP_DIR + self._BASE_URL + url[url.rfind("/") + 1:]
|
||||||
PiconsParser.parse(path, self._picons_path, self._TMP_DIR, provider.on_id, self.get_picons_format())
|
PiconsParser.parse(path, self._picons_path, self._TMP_DIR, provider.on_id, self.get_picons_format())
|
||||||
|
self.resize(self._picons_path)
|
||||||
self.show_info_message("Done", Gtk.MessageType.INFO)
|
self.show_info_message("Done", Gtk.MessageType.INFO)
|
||||||
|
|
||||||
def write_to_buffer(self, fd, condition):
|
def write_to_buffer(self, fd, condition):
|
||||||
@@ -147,6 +151,16 @@ class PiconsDialog:
|
|||||||
insert = buf.get_insert()
|
insert = buf.get_insert()
|
||||||
self._text_view.scroll_to_mark(insert, 0.0, True, 0.0, 1.0)
|
self._text_view.scroll_to_mark(insert, 0.0, True, 0.0, 1.0)
|
||||||
|
|
||||||
|
def resize(self, path):
|
||||||
|
if self._resize_no_radio_button.get_active():
|
||||||
|
return
|
||||||
|
|
||||||
|
self.show_info_message("Resizing...", Gtk.MessageType.INFO)
|
||||||
|
command = "mogrify -resize {}! *.png".format(
|
||||||
|
"320x240" if self._resize_220_132_radio_button.get_active() else "100x60").split()
|
||||||
|
self._current_process = subprocess.Popen(command, universal_newlines=True, cwd=path)
|
||||||
|
self._current_process.wait()
|
||||||
|
|
||||||
@run_task
|
@run_task
|
||||||
def on_cancel(self, item):
|
def on_cancel(self, item):
|
||||||
if self._current_process:
|
if self._current_process:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/env bash
|
#!/bin/env bash
|
||||||
VER="0.2.1_Pre-alpha"
|
VER="0.2.2_Pre-alpha"
|
||||||
B_PATH="dist/DemonEditor"
|
B_PATH="dist/DemonEditor"
|
||||||
DEB_PATH="$B_PATH/usr/share/demoneditor"
|
DEB_PATH="$B_PATH/usr/share/demoneditor"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Package: DemonEditor
|
Package: DemonEditor
|
||||||
Version: 0.2.1-Pre-alpha
|
Version: 0.2.2-Pre-alpha
|
||||||
Section: utils
|
Section: utils
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Architecture: all
|
Architecture: all
|
||||||
|
|||||||
Reference in New Issue
Block a user