diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py
index a03bfddf..dd94a2d9 100644
--- a/app/ui/main_app_window.py
+++ b/app/ui/main_app_window.py
@@ -11,9 +11,9 @@ from app.eparser.ecommons import CAS, Flag
from app.eparser.enigma.bouquets import BqServiceType
from app.eparser.neutrino.bouquets import BqType
from app.properties import get_config, write_config, Profile
-from .search import search
+from .search import SearchProvider
from . import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON
-from .dialogs import show_dialog, DialogType, get_chooser_dialog, WaitDialog
+from .dialogs import show_dialog, DialogType, get_chooser_dialog, WaitDialog, get_message
from .download_dialog import show_download_dialog
from .main_helper import edit_marker, insert_marker, move_items, rename, ViewTarget, set_flags, locate_in_services, \
scroll_to, get_base_model, update_picons, copy_picon_reference, assign_picon, remove_picon, \
@@ -155,12 +155,6 @@ class MainAppWindow:
self.__radio_count_label = builder.get_object("radio_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.__search_info_bar = builder.get_object("search_info_bar")
- # 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.__filter_info_bar = builder.get_object("filter_info_bar")
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)
@@ -169,6 +163,15 @@ class MainAppWindow:
self.__clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
# Wait dialog
self.__wait_dialog = WaitDialog(self.__main_window)
+ # 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.__filter_info_bar = builder.get_object("filter_info_bar")
+ # Search
+ self.__search_info_bar = builder.get_object("search_info_bar")
+ self.__search_provider = SearchProvider(self.__services_view, self.__fav_view, self.__bouquets_view,
+ self.__services, self.__bouquets)
self.__main_window.show()
def init_drag_and_drop(self):
@@ -519,8 +522,8 @@ class MainAppWindow:
self.update_services_counts(len(self.__services_model))
self.update_picons()
except FileNotFoundError as e:
- show_dialog(DialogType.ERROR, self.__main_window, getattr(e, "message", str(e)) +
- "\n\nPlease, download files from receiver or setup your path for read data!")
+ show_dialog(DialogType.ERROR, self.__main_window, getattr(e, "message", str(e)) + "\n\n" +
+ get_message("Please, download files from receiver or setup your path for read data!"))
except SyntaxError as e:
show_dialog(DialogType.ERROR, self.__main_window, str(e))
finally:
@@ -901,19 +904,14 @@ class MainAppWindow:
self.__search_info_bar.set_visible(toggle_button.get_active())
def on_search_down(self, item):
- show_dialog(DialogType.ERROR, transient=self.__main_window, text="Not implemented yet!")
+ self.__search_provider.on_search_down()
def on_search_up(self, item):
- show_dialog(DialogType.ERROR, transient=self.__main_window, text="Not implemented yet!")
+ self.__search_provider.on_search_up()
@run_idle
- def on_search(self, entry, event):
- search(entry.get_text(),
- self.__services_view,
- self.__fav_view,
- self.__bouquets_view,
- self.__services,
- self.__bouquets)
+ def on_search(self, entry):
+ self.__search_provider.search(entry.get_text())
@run_idle
def on_service_edit(self, view):
diff --git a/app/ui/main_window.glade b/app/ui/main_window.glade
index b80b0dfd..a9f6e865 100644
--- a/app/ui/main_window.glade
+++ b/app/ui/main_window.glade
@@ -1204,7 +1204,7 @@
edit-find-symbolic
False
False
-
+
False
diff --git a/app/ui/search.py b/app/ui/search.py
index 9d01375f..7e005f1c 100644
--- a/app/ui/search.py
+++ b/app/ui/search.py
@@ -2,28 +2,51 @@
from app.ui.main_helper import get_base_model
-def search(text, srv_view, fav_view, bqs_view, services, bouquets):
- for view in srv_view, fav_view:
- model = get_base_model(view.get_model())
- selection = view.get_selection()
- selection.unselect_all()
- if not text:
- continue
- paths = []
- text = text.upper()
- for r in model:
- if text in str(r[:]).upper():
- path = r.path
- selection.select_path(r.path)
- paths.append(path)
-
- if paths:
- view.scroll_to_cell(paths[0], None)
-
-
class SearchProvider:
- def __init__(self):
- pass
+ def __init__(self, srv_view, fav_view, bqs_view, services, bouquets):
+ self._paths = []
+ self._current_index = -1
+ self._max_indexes = 0
+ self._srv_view = srv_view
+ self._fav_view = fav_view
+ self._bqs_view = bqs_view
+ self._services = services
+ self._bouquets = bouquets
+
+ def search(self, text, ):
+ self._current_index = -1
+ self._paths.clear()
+ for view in self._srv_view, self._fav_view:
+ model = get_base_model(view.get_model())
+ selection = view.get_selection()
+ selection.unselect_all()
+ if not text:
+ continue
+
+ text = text.upper()
+ for r in model:
+ if text in str(r[:]).upper():
+ path = r.path
+ selection.select_path(r.path)
+ self._paths.append((view, path))
+
+ self._max_indexes = len(self._paths) - 1
+ if self._max_indexes > 0:
+ self.on_search_down()
+
+ def scroll_to(self, index):
+ view, path = self._paths[index]
+ view.scroll_to_cell(path, None)
+
+ def on_search_down(self):
+ if self._current_index < self._max_indexes:
+ self._current_index += 1
+ self.scroll_to(self._current_index)
+
+ def on_search_up(self):
+ if self._current_index > -1:
+ self._current_index -= 1
+ self.scroll_to(self._current_index)
if __name__ == "__main__":