From b0ec8e548336cb37db1581e055127d4b4986ab4d Mon Sep 17 00:00:00 2001 From: DYefremov Date: Fri, 28 Feb 2020 20:59:53 +0300 Subject: [PATCH] added picons multiple assignment --- app/ui/main_app_window.py | 45 ++++- app/ui/main_helper.py | 56 +++--- app/ui/main_window.glade | 24 ++- app/ui/picons_dialog.glade | 340 +++++++++++++++++++++++++++--------- app/ui/picons_downloader.py | 119 +++++++++++-- 5 files changed, 440 insertions(+), 144 deletions(-) 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 True False - gtk-select-all + gtk-edit @@ -1581,7 +1581,6 @@ Author: Dmitriy Yefremov vertical - True False @@ -1748,18 +1747,6 @@ Author: Dmitriy Yefremov 1 - - - True - False - 2 - - - False - True - 2 - - 250 @@ -1767,6 +1754,7 @@ Author: Dmitriy Yefremov True 1 1 + 2 True @@ -1777,6 +1765,8 @@ Author: Dmitriy Yefremov True False + 2 + 2 Services @@ -1808,6 +1798,8 @@ Author: Dmitriy Yefremov + + @@ -2326,6 +2318,8 @@ Author: Dmitriy Yefremov True False + 2 + 2 Bouquet details @@ -2599,6 +2593,8 @@ Author: Dmitriy Yefremov True False + 2 + 2 Bouquets diff --git a/app/ui/picons_dialog.glade b/app/ui/picons_dialog.glade index be299a79..d6dcd9ae 100644 --- a/app/ui/picons_dialog.glade +++ b/app/ui/picons_dialog.glade @@ -3,7 +3,7 @@ The MIT License (MIT) -Copyright (c) 2018-2019 Dmitriy Yefremov +Copyright (c) 2018-2020 Dmitriy Yefremov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26,13 +26,27 @@ THE SOFTWARE. Author: Dmitriy Yefremov --> - + - + + + + + + + + + + + picons_list_store + + + picons_filter_model + @@ -68,7 +82,7 @@ Author: Dmitriy Yefremov False True True - + @@ -78,7 +92,7 @@ Author: Dmitriy Yefremov False remove_selection_image False - + @@ -92,13 +106,11 @@ Author: Dmitriy Yefremov - - 1 + False - True True - emblem-photos - dialog + True + True @@ -131,7 +143,6 @@ Author: Dmitriy Yefremov 2 - True False True False @@ -153,20 +164,8 @@ Author: Dmitriy Yefremov 0 - - - True - False - - - False - True - 1 - - - True False True False @@ -182,6 +181,16 @@ Author: Dmitriy Yefremov + + 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):