diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py
index f789af13..6f81b04e 100644
--- a/app/ui/main_app_window.py
+++ b/app/ui/main_app_window.py
@@ -99,6 +99,8 @@ class Application(Gtk.Application):
"on_to_fav_end_copy": self.on_to_fav_end_copy,
"on_view_drag_begin": self.on_view_drag_begin,
"on_view_drag_data_get": self.on_view_drag_data_get,
+ "on_services_view_drag_drop": self.on_services_view_drag_drop,
+ "on_services_view_drag_data_received": self.on_services_view_drag_data_received,
"on_view_drag_data_received": self.on_view_drag_data_received,
"on_bq_view_drag_data_received": self.on_bq_view_drag_data_received,
"on_view_press": self.on_view_press,
@@ -243,6 +245,7 @@ class Application(Gtk.Application):
self._filter_types_model = builder.get_object("filter_types_list_store")
self._filter_sat_positions_model = builder.get_object("filter_sat_positions_list_store")
self._filter_only_free_button = builder.get_object("filter_only_free_button")
+ self._filter_bar.bind_property("search-mode-enabled", self._filter_bar, "visible")
# Player
self._player_box = builder.get_object("player_box")
self._player_scale = builder.get_object("player_scale")
@@ -269,6 +272,7 @@ class Application(Gtk.Application):
self._player_frame = builder.get_object("player_frame")
# Search
self._search_bar = builder.get_object("search_bar")
+ self._search_bar.bind_property("search-mode-enabled", self._search_bar, "visible")
self._search_entry = builder.get_object("search_entry")
self._search_provider = SearchProvider((self._services_view, self._fav_view, self._bouquets_view),
builder.get_object("search_down_button"),
@@ -385,19 +389,25 @@ class Application(Gtk.Application):
""" Enable drag-and-drop """
target = []
bq_target = []
+
self._services_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, target, Gdk.DragAction.COPY)
+ self._services_view.enable_model_drag_dest([], Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE)
self._fav_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, target,
Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE)
self._fav_view.enable_model_drag_dest(target, Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE)
self._bouquets_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, bq_target,
Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE)
self._bouquets_view.enable_model_drag_dest(bq_target, Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE)
- self._fav_view.drag_dest_set_target_list(None)
+
self._fav_view.drag_source_set_target_list(None)
self._fav_view.drag_dest_add_text_targets()
self._fav_view.drag_source_add_text_targets()
+ self._fav_view.drag_dest_add_uri_targets()
+
self._services_view.drag_source_set_target_list(None)
self._services_view.drag_source_add_text_targets()
+ self._services_view.drag_dest_add_uri_targets()
+
self._bouquets_view.drag_dest_set_target_list(None)
self._bouquets_view.drag_source_set_target_list(None)
self._bouquets_view.drag_dest_add_text_targets()
@@ -749,9 +759,24 @@ class Application(Gtk.Application):
if selection:
data.set_text(selection, -1)
+ def on_services_view_drag_drop(self, view, drag_context, x, y, time):
+ view.stop_emission_by_name("drag_drop")
+ # https://stackoverflow.com/q/7661016 [Some data was dropped, get the data!]
+ view.drag_get_data(drag_context, drag_context.list_targets()[-1], time)
+
+ def on_services_view_drag_data_received(self, view, drag_context, x, y, data, info, time):
+ # Needs for the GtkTreeView when using models [filter, sort]
+ # that don't support the GtkTreeDragDest interface.
+ view.stop_emission_by_name("drag_data_received")
+ self.on_view_drag_data_received(view, drag_context, x, y, data, info, time)
+
def on_view_drag_data_received(self, view, drag_context, x, y, data, info, time):
- self.receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=data.get_text())
- return False
+ txt = data.get_text()
+ uris = data.get_uris()
+ if txt:
+ self.receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=txt)
+ elif len(uris) == 1:
+ self.on_assign_picon(view, uris[0])
def on_bq_view_drag_data_received(self, view, drag_context, x, y, data, info, time):
model_name, model = get_model_data(view)
@@ -1958,9 +1983,10 @@ class Application(Gtk.Application):
if value:
self.update_filter_sat_positions()
self._filter_entry.grab_focus()
+ else:
+ self._filter_entry.set_text("")
self._filter_bar.set_search_mode(value)
- self._filter_bar.set_visible(value)
def init_sat_positions(self):
self._sat_positions.clear()
@@ -2202,27 +2228,28 @@ class Application(Gtk.Application):
data = r[Column.SRV_PICON_ID].split("_")
ids["{}:{}:{}".format(data[3], data[5], data[6])] = r[Column.SRV_PICON_ID]
- PiconsDialog(self._main_window, self._settings, ids, self._sat_positions).show()
- self.update_picons()
+ PiconsDialog(self._main_window, self._settings, ids, self._sat_positions, self.update_picons).show()
@run_task
def update_picons(self):
update_picons_data(self._settings.picons_local_path, self._picons)
append_picons(self._picons, self._services_model)
- def on_assign_picon(self, view):
+ def on_assign_picon(self, view, path=None):
assign_picon(self.get_target_view(view),
self._services_view,
self._fav_view,
self._main_window,
self._picons,
self._settings,
- self._services)
+ self._services,
+ path)
def on_remove_picon(self, view):
remove_picon(self.get_target_view(view),
self._services_view,
- self._fav_view, self._picons,
+ self._fav_view,
+ self._picons,
self._settings)
def on_reference_picon(self, view):
diff --git a/app/ui/main_helper.py b/app/ui/main_helper.py
index a7ca724e..356d33af 100644
--- a/app/ui/main_helper.py
+++ b/app/ui/main_helper.py
@@ -362,39 +362,44 @@ def append_picons(picons, model):
GLib.idle_add(lambda: next(app, False), priority=GLib.PRIORITY_LOW)
-def assign_picon(target, srv_view, fav_view, transient, picons, settings, services):
+def assign_picon(target, srv_view, fav_view, transient, picons, settings, services, p_path=None):
view = srv_view if target is ViewTarget.SERVICES else fav_view
model, paths = view.get_selection().get_selected_rows()
- if not is_only_one_item_selected(paths, transient):
- return
- response = get_chooser_dialog(transient, settings, "*.png", "png files")
- if response == Gtk.ResponseType.CANCEL:
- return
+ if not p_path:
+ p_path = get_chooser_dialog(transient, settings, "*.png", "png files")
+ if p_path == Gtk.ResponseType.CANCEL:
+ return
- if not str(response).endswith(".png"):
+ if not str(p_path).endswith(".png") or not os.path.isfile(p_path):
show_dialog(DialogType.ERROR, transient, text="No png file is selected!")
return
- picon_pos = Column.SRV_PICON
- model = get_base_model(model)
- itr = model.get_iter(paths)
- fav_id = model.get_value(itr, Column.SRV_FAV_ID if target is ViewTarget.SERVICES else Column.FAV_ID)
- picon_id = services.get(fav_id)[Column.SRV_PICON_ID]
+ p_pos = Column.SRV_PICON
+ col_num = Column.SRV_FAV_ID if target is ViewTarget.SERVICES else Column.FAV_ID
+ itrs = [model.get_iter(p) for p in paths]
- if picon_id:
- if os.path.isfile(response):
+ if target is ViewTarget.SERVICES:
+ f_model = model.get_model()
+ itrs = [f_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr)) for itr in itrs]
+ model = get_base_model(model)
+
+ for itr in itrs:
+ fav_id = model.get_value(itr, col_num)
+ picon_id = services.get(fav_id)[Column.SRV_PICON_ID]
+
+ if picon_id:
picons_path = settings.picons_local_path
os.makedirs(os.path.dirname(picons_path), exist_ok=True)
picon_file = picons_path + picon_id
- shutil.copy(response, picon_file)
+ shutil.copy(p_path, picon_file)
picon = get_picon_pixbuf(picon_file)
picons[picon_id] = picon
- model.set_value(itr, picon_pos, picon)
+ model.set_value(itr, p_pos, picon)
if target is ViewTarget.SERVICES:
- set_picon(fav_id, fav_view.get_model(), picon, Column.FAV_ID, picon_pos)
+ set_picon(fav_id, fav_view.get_model(), picon, Column.FAV_ID, p_pos)
else:
- set_picon(fav_id, get_base_model(srv_view.get_model()), picon, Column.SRV_FAV_ID, picon_pos)
+ set_picon(fav_id, get_base_model(srv_view.get_model()), picon, Column.SRV_FAV_ID, p_pos)
def set_picon(fav_id, model, picon, fav_id_pos, picon_pos):
@@ -407,14 +412,19 @@ def set_picon(fav_id, model, picon, fav_id_pos, picon_pos):
def remove_picon(target, srv_view, fav_view, picons, settings):
view = srv_view if target is ViewTarget.SERVICES else fav_view
model, paths = view.get_selection().get_selected_rows()
- model = get_base_model(model)
fav_ids = []
picon_ids = []
picon_pos = Column.SRV_PICON # picon position is equal for services and fav
- for path in paths:
- itr = model.get_iter(path)
+ itrs = [model.get_iter(p) for p in paths]
+
+ if target is ViewTarget.SERVICES:
+ f_model = model.get_model()
+ itrs = [f_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr)) for itr in itrs]
+ model = get_base_model(model)
+
+ for itr in itrs:
model.set_value(itr, picon_pos, None)
if target is ViewTarget.SERVICES:
fav_ids.append(model.get_value(itr, Column.SRV_FAV_ID))
@@ -426,8 +436,10 @@ def remove_picon(target, srv_view, fav_view, picons, settings):
else:
fav_ids.append(fav_id)
+ fav_id_column = Column.FAV_ID if target is ViewTarget.SERVICES else Column.SRV_FAV_ID
+
def remove(md, path, it):
- if md.get_value(it, Column.FAV_ID if target is ViewTarget.SERVICES else Column.SRV_FAV_ID) in fav_ids:
+ if md.get_value(it, fav_id_column) in fav_ids:
md.set_value(it, picon_pos, None)
if target is ViewTarget.FAV:
picon_ids.append(md.get_value(it, Column.SRV_PICON_ID))
diff --git a/app/ui/main_window.glade b/app/ui/main_window.glade
index 2487253f..0d3e2677 100644
--- a/app/ui/main_window.glade
+++ b/app/ui/main_window.glade
@@ -1242,7 +1242,7 @@ Author: Dmitriy Yefremov
@@ -1581,7 +1581,6 @@ Author: Dmitriy Yefremov
vertical
@@ -92,13 +106,11 @@ Author: Dmitriy Yefremov
-
- 1
+
False
- True
True
- emblem-photos
- dialog
+ True
+ True
+
+ False
+ True
+ 1
+
+
+
+
+ False
+
False
True
@@ -204,17 +213,6 @@ Author: Dmitriy Yefremov
-
- False
- True
- 3
-
-
-
-
- True
- False
-
False
True
@@ -226,7 +224,7 @@ Author: Dmitriy Yefremov
True
True
True
- Download picons from the receiver
+ Download from the receiver
@@ -247,7 +245,7 @@ Author: Dmitriy Yefremov
True
True
True
- Remove picons from the receiver
+ Remove all picons from the receiver
@@ -289,31 +287,192 @@ Author: Dmitriy Yefremov
3
-
-
-
-
- 640
- False
- vertical
- 2
-
-
- False
- True
- spread
+
+
+ True
+ True
+ True
+ Filter
+
+
+
+ True
+ False
+ Filter
+ gtk-select-all
+
+
- True
- True
- 0
+ end
+ 3
+
+
+
+
+ True
+ False
+ vertical
True
True
+
+
+ True
+ False
+ vertical
+
+
+ False
+ 1
+ 1
+
+
+ True
+ True
+ edit-find-symbolic
+ False
+ False
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ False
+ 1
+ 1
+
+
+ True
+ True
+ gtk-spell-check
+ False
+ False
+
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 0.5
+ in
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ vertical
+ 5
+
+
+ True
+ False
+ select-folder
+
+
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ True
+ True
+ in
+
+
+ True
+ True
+ 5
+ picons_sort_model
+ 5
+ 5
+ 1
+ 5
+
+
+
+
+ 128
+
+
+ 0
+
+
+
+
+ center
+
+
+ 1
+
+
+
+
+
+
+ True
+ True
+ 4
+
+
+
+
+
+
+ True
+ False
+ Current picons path:
+
+
+
+
+ True
+ True
+ 2
+
+
+
+
+
+
+ True
+ False
+ Explorer
+
+
+ False
+
+
True
@@ -328,6 +487,7 @@ Author: Dmitriy Yefremov
True
False
+ 5
5
@@ -345,7 +505,7 @@ Author: Dmitriy Yefremov
5
in
-
+
True
True
satellites_list_store
@@ -355,7 +515,7 @@ Author: Dmitriy Yefremov
-
+
@@ -417,7 +577,6 @@ Author: Dmitriy Yefremov
True
False
- 2
Loading data...
@@ -430,7 +589,6 @@ Author: Dmitriy Yefremov
True
False
- 2
True
@@ -460,14 +618,13 @@ Author: Dmitriy Yefremov
False
5
5
+ 5
vertical
2
True
True
- 5
- 5
2
network-workgroup-symbolic
False
@@ -486,20 +643,18 @@ Author: Dmitriy Yefremov
150
True
True
- 5
- 5
2
out
-
+
True
True
- True
providers_list_store
+ 1
-
+
@@ -611,8 +766,6 @@ Author: Dmitriy Yefremov
True
False
- 5
- 5
2
2
2
@@ -686,9 +839,6 @@ Author: Dmitriy Yefremov
True
True
- 5
- 5
- 5
folder-open
False
@@ -745,14 +895,12 @@ Author: Dmitriy Yefremov
True
False
center
- 5
Enigma2 (default)
True
True
False
- True
True
neutrino_mp_radio_button
@@ -768,7 +916,6 @@ Author: Dmitriy Yefremov
True
True
False
- True
True
enigma2_radio_button
@@ -822,7 +969,6 @@ Author: Dmitriy Yefremov
True
True
False
- True
True
resize_100_60_radio_button
@@ -838,7 +984,6 @@ Author: Dmitriy Yefremov
True
True
False
- True
True
resize_100_60_radio_button
@@ -854,7 +999,6 @@ Author: Dmitriy Yefremov
True
True
False
- True
True
resize_no_radio_button
@@ -894,6 +1038,9 @@ Author: Dmitriy Yefremov
+
+ 1
+
@@ -902,6 +1049,7 @@ Author: Dmitriy Yefremov
Downloader
+ 1
False
@@ -980,6 +1128,33 @@ Author: Dmitriy Yefremov
False
True
+ 0
+
+
+
+
+ True
+ False
+ Enigma2 -> Neutrino-MP
+
+
+ False
+ True
+ end
+ 1
+
+
+
+
+ True
+ False
+ gtk-convert
+ 3
+
+
+ False
+ True
+ end
2
@@ -994,7 +1169,7 @@ Author: Dmitriy Yefremov
- 1
+ 2
@@ -1005,16 +1180,10 @@ Author: Dmitriy Yefremov
Converter
- 1
+ 2
False
-
-
-
-
-
-
True
@@ -1067,7 +1236,7 @@ Author: Dmitriy Yefremov
True
-
+
False
end
@@ -1081,7 +1250,7 @@ Author: Dmitriy Yefremov
-
+
False
@@ -1106,6 +1275,9 @@ Author: Dmitriy Yefremov
0
+
+
+
False
diff --git a/app/ui/picons_downloader.py b/app/ui/picons_downloader.py
index 80b82e26..50092730 100644
--- a/app/ui/picons_downloader.py
+++ b/app/ui/picons_downloader.py
@@ -4,22 +4,24 @@ import shutil
import subprocess
import tempfile
-from gi.repository import GLib, GdkPixbuf
+from gi.repository import GLib, GdkPixbuf, Gio
-from app.commons import run_idle, run_task
+from app.commons import run_idle, run_task, run_with_delay
from app.connections import upload_data, DownloadType, download_data, remove_picons
from app.settings import SettingsType
from app.tools.picons import PiconsParser, parse_providers, Provider, convert_to
from app.tools.satellites import SatellitesParser, SatelliteSource
from .dialogs import show_dialog, DialogType, get_message
-from .main_helper import update_entry_data, append_text_to_tview, scroll_to, on_popup_menu
+from .main_helper import update_entry_data, append_text_to_tview, scroll_to, on_popup_menu, update_picons_data, \
+ get_base_model
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, TV_ICON
class PiconsDialog:
- def __init__(self, transient, settings, picon_ids, sat_positions):
+ def __init__(self, transient, settings, picon_ids, sat_positions, callback):
self._picon_ids = picon_ids
self._sat_positions = sat_positions
+ self._callback = callback
self._TMP_DIR = tempfile.gettempdir() + "/"
self._BASE_URL = "www.lyngsat.com/packages/"
self._PATTERN = re.compile(r"^https://www\.lyngsat\.com/[\w-]+\.html$")
@@ -38,27 +40,38 @@ class PiconsDialog:
"on_picons_dir_open": self.on_picons_dir_open,
"on_selected_toggled": self.on_selected_toggled,
"on_url_changed": self.on_url_changed,
+ "on_picons_filter_changed": self.on_picons_filter_changed,
"on_position_edited": self.on_position_edited,
"on_notebook_switch_page": self.on_notebook_switch_page,
"on_convert": self.on_convert,
+ "on_picons_folder_changed": self.on_picons_folder_changed,
+ "on_view_drag_data_get": self.on_view_drag_data_get,
+ "on_picons_view_realize": self.on_picons_view_realize,
"on_satellites_view_realize": self.on_satellites_view_realize,
"on_satellite_selection": self.on_satellite_selection,
"on_select_all": self.on_select_all,
"on_unselect_all": self.on_unselect_all,
+ "on_filter_toggled": self.on_filter_toggled,
"on_popup_menu": on_popup_menu}
builder = Gtk.Builder()
- builder.set_translation_domain(TEXT_DOMAIN)
builder.add_from_file(UI_RESOURCES_PATH + "picons_dialog.glade")
builder.connect_signals(handlers)
self._dialog = builder.get_object("picons_dialog")
self._dialog.set_transient_for(transient)
- self._providers_tree_view = builder.get_object("providers_tree_view")
- self._satellites_tree_view = builder.get_object("satellites_tree_view")
+ self._picons_view = builder.get_object("picons_view")
+ self._providers_view = builder.get_object("providers_view")
+ self._satellites_view = builder.get_object("satellites_view")
+ self._picons_filter_model = builder.get_object("picons_filter_model")
+ self._picons_filter_model.set_visible_func(self.picons_filter_function)
+ self._explorer_path_button = builder.get_object("explorer_path_button")
self._expander = builder.get_object("expander")
self._text_view = builder.get_object("text_view")
self._info_bar = builder.get_object("info_bar")
+ self._filter_bar = builder.get_object("filter_bar")
+ self._filter_button = builder.get_object("filter_button")
+ self._picons_filter_entry = builder.get_object("picons_filter_entry")
self._ip_entry = builder.get_object("ip_entry")
self._picons_entry = builder.get_object("picons_entry")
self._url_entry = builder.get_object("url_entry")
@@ -84,7 +97,12 @@ class PiconsDialog:
self._satellite_label.bind_property("visible", builder.get_object("loading_data_spinner"), "visible", 4)
self._cancel_button.bind_property("visible", self._header_download_box, "visible", 4)
self._convert_button.bind_property("visible", self._header_download_box, "visible", 4)
- # style
+ self._load_providers_button.bind_property("visible", self._receive_button, "visible")
+ self._load_providers_button.bind_property("visible", builder.get_object("download_box_separator"), "visible")
+ self._filter_bar.bind_property("search-mode-enabled", self._filter_bar, "visible")
+ # Init drag-and-drop
+ self.init_drag_and_drop()
+ # Style
self._style_provider = Gtk.CssProvider()
self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css")
self._url_entry.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider,
@@ -107,7 +125,54 @@ class PiconsDialog:
self._satellite_label.show()
def show(self):
- self._dialog.run()
+ self._dialog.show()
+
+ def on_picons_view_realize(self, view):
+ self._explorer_path_button.set_current_folder(self._picons_path)
+
+ def on_picons_folder_changed(self, button):
+ path = button.get_filename()
+ if not path or not os.path.exists(path):
+ return
+
+ GLib.idle_add(self._explorer_path_button.set_sensitive, False)
+ gen = self.update_picons(path)
+ GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
+
+ def update_picons(self, path):
+ p_model = self._picons_view.get_model()
+ self._picons_view.set_model(None)
+ model = get_base_model(p_model)
+ model.clear()
+ self._picons_view.set_model(p_model)
+
+ for file in os.listdir(path):
+ if self._terminate:
+ return
+
+ try:
+ p = GdkPixbuf.Pixbuf.new_from_file(filename="{}/{}".format(path, file))
+ except GLib.GError as e:
+ pass
+ else:
+ yield model.append((p, file))
+
+ self._explorer_path_button.set_sensitive(True)
+ yield True
+
+ # ***************** Drag-and-drop ********************* #
+
+ def init_drag_and_drop(self):
+ self._picons_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
+ self._picons_view.drag_source_add_uri_targets()
+
+ def on_view_drag_data_get(self, view, drag_context, data, info, time):
+ model = view.get_model()
+ path = view.get_selected_items()[0]
+ p_path = "{}/{}".format(self._explorer_path_button.get_filename(), model.get_value(model.get_iter(path), 1))
+ data.set_uris([p_path])
+
+ # ******************** ####### ************************* #
def on_satellites_view_realize(self, view):
self.get_satellites(view)
@@ -153,7 +218,7 @@ class PiconsDialog:
self.show_info_message(str(e), Gtk.MessageType.ERROR)
else:
GLib.io_add_watch(self._current_process.stderr, GLib.IO_IN, self.write_to_buffer)
- model = self._providers_tree_view.get_model()
+ model = self._providers_view.get_model()
model.clear()
self.append_providers(url, model)
@@ -198,7 +263,7 @@ class PiconsDialog:
if not self._POS_PATTERN.match(prv[2]):
self.show_info_message(
get_message("Specify the correct position value for the provider!"), Gtk.MessageType.ERROR)
- scroll_to(prv.path, self._providers_tree_view)
+ scroll_to(prv.path, self._providers_view)
return
try:
@@ -266,8 +331,10 @@ class PiconsDialog:
if self.on_cancel():
return True
+ self._terminate = True
self.save_window_size(window)
self.clean_data()
+ self._callback()
GLib.idle_add(self._dialog.destroy)
def save_window_size(self, window):
@@ -334,7 +401,7 @@ class PiconsDialog:
@run_idle
def on_selected_toggled(self, toggle, path):
- model = self._providers_tree_view.get_model()
+ model = self._providers_view.get_model()
model.set_value(model.get_iter(path), 7, not toggle.get_active())
self.update_receive_button_state()
@@ -348,18 +415,40 @@ class PiconsDialog:
view.get_model().foreach(lambda mod, path, itr: mod.set_value(itr, 7, select))
self.update_receive_button_state()
+ def on_filter_toggled(self, button):
+ active = button.get_active()
+ self._filter_bar.set_search_mode(active)
+ if not active:
+ self._picons_filter_entry.set_text("")
+
def on_url_changed(self, entry):
suit = self._PATTERN.search(entry.get_text())
entry.set_name("GtkEntry" if suit else "digit-entry")
self._load_providers_button.set_sensitive(suit if suit else False)
+ @run_with_delay(1)
+ def on_picons_filter_changed(self, entry):
+ GLib.idle_add(self._picons_filter_model.refilter, priority=GLib.PRIORITY_LOW)
+
+ def picons_filter_function(self, model, itr, data):
+ if self._picons_filter_model is None or self._picons_filter_model == "None":
+ return True
+
+ t = model.get_value(itr, 1)
+ return not t or self._picons_filter_entry.get_text().upper() in t.upper()
+
def on_position_edited(self, render, path, value):
- model = self._providers_tree_view.get_model()
+ model = self._providers_view.get_model()
model.set_value(model.get_iter(path), 2, value)
@run_idle
def on_notebook_switch_page(self, nb, box, tab_num):
- self._convert_button.set_visible(tab_num)
+ self._convert_button.set_visible(tab_num > 1)
+ self._load_providers_button.set_visible(tab_num == 1)
+ is_explorer = tab_num == 0
+ self._filter_button.set_visible(is_explorer)
+ if is_explorer:
+ self.on_picons_folder_changed(self._explorer_path_button)
@run_idle
def on_convert(self, item):
@@ -388,7 +477,7 @@ class PiconsDialog:
def get_selected_providers(self):
""" returns selected providers """
- return [r for r in self._providers_tree_view.get_model() if r[7]]
+ return [r for r in self._providers_view.get_model() if r[7]]
@run_idle
def show_dialog(self, message, dialog_type):