global search navigation skeleton

This commit is contained in:
DYefremov
2018-03-06 19:06:16 +03:00
parent 1d6b8c2558
commit 03e18401cc
3 changed files with 62 additions and 41 deletions

View File

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

View File

@@ -1204,7 +1204,7 @@
<property name="primary_icon_name">edit-find-symbolic</property>
<property name="primary_icon_activatable">False</property>
<property name="primary_icon_sensitive">False</property>
<signal name="key-release-event" handler="on_search" swapped="no"/>
<signal name="search-changed" handler="on_search" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>

View File

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