Compare commits

..

12 Commits
0.2.1 ... 0.2.2

Author SHA1 Message Date
Dmitriy Yefremov
d9390aa7be Update README.md 2018-01-26 21:26:03 +03:00
Dmitriy Yefremov
e12cc86e5f Update readme 2018-01-26 21:21:40 +03:00
DYefremov
f1ef9fe4aa decoupling deletion, deletion with considering filter 2018-01-26 15:15:39 +03:00
Dmitriy Yefremov
728bfd0b20 added remove selection keys 2018-01-25 21:43:48 +03:00
Dmitriy Yefremov
1d6022b6db fix lock\hide 2018-01-25 21:05:24 +03:00
DYefremov
8609d30ac9 bouquets fix, new implementation of services filter 2018-01-25 16:11:52 +03:00
DYefremov
fde06dca89 filter revert 2018-01-24 13:39:11 +03:00
Dmitriy Yefremov
e41bf5f58f little gui changes 2018-01-24 00:05:15 +03:00
Dmitriy Yefremov
b1488df9ce little gui changes 2018-01-23 22:58:43 +03:00
DYefremov
c6e4b3624b services filter skeleton 2018-01-23 16:18:28 +03:00
DYefremov
26b843921b force ctrl for fav and services lists 2018-01-22 14:51:34 +03:00
Dmitriy Yefremov
e73638d006 resize option for picons 2018-01-20 22:17:18 +03:00
11 changed files with 359 additions and 118 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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