From df688d919e38809d08663fe776d07c22143dc266 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Sat, 16 Sep 2023 01:18:36 -0500 Subject: [PATCH] Fixed search failing in some dirs; fixed pathbar autofilling with one found path --- plugins/searcher/mixins/file_search_mixin.py | 7 +- plugins/searcher/mixins/grep_search_mixin.py | 6 +- plugins/searcher/utils/ipc_server.py | 11 ++- plugins/searcher/utils/search.py | 29 +++++--- .../solarfm-0.0.1/solarfm/core/controller.py | 3 +- .../solarfm/core/mixins/ui/tab_mixin.py | 68 ++++++++++-------- .../core/widgets/files_view/tab_mixin.py | 71 +++++++++++-------- .../core/widgets/files_view/window_mixin.py | 5 +- .../solarfm-0.0.1/solarfm/core/window.py | 1 + src/versions/solarfm-0.0.1/solarfm/data.txt | 11 +++ 10 files changed, 132 insertions(+), 80 deletions(-) create mode 100644 src/versions/solarfm-0.0.1/solarfm/data.txt diff --git a/plugins/searcher/mixins/file_search_mixin.py b/plugins/searcher/mixins/file_search_mixin.py index 1826822..cb9f537 100644 --- a/plugins/searcher/mixins/file_search_mixin.py +++ b/plugins/searcher/mixins/file_search_mixin.py @@ -81,14 +81,17 @@ class FileSearchMixin: self._list_proc = None + def _exec_find_file_query(self, widget=None, eve=None): query = widget.get_text() if not query in ("", None): self.search_query = query - target_dir = shlex.quote( self._fm_state.tab.get_current_directory() ) - command = ["python", f"{self.path}/utils/search.py", "-t", "file_search", "-d", f"{target_dir}", "-q", f"{query}"] + target_dir = shlex.quote( self._fm_state.tab.get_current_directory() ) + command = ["python", f"{self.path}/utils/search.py", "-t", "file_search", "-d", f"{target_dir}", "-q", f"{query}"] + self._spinner.start() + self._list_proc = subprocess.Popen(command, cwd=self.path, stdin=None, stdout=None, stderr=None) diff --git a/plugins/searcher/mixins/grep_search_mixin.py b/plugins/searcher/mixins/grep_search_mixin.py index a4d1dc3..93a2405 100644 --- a/plugins/searcher/mixins/grep_search_mixin.py +++ b/plugins/searcher/mixins/grep_search_mixin.py @@ -87,12 +87,14 @@ class GrepSearchMixin: if not query.strip() in ("", None): self.grep_query = query + target_dir = shlex.quote( self._fm_state.tab.get_current_directory() ) + command = ["python", f"{self.path}/utils/search.py", "-t", "grep_search", "-d", f"{target_dir}", "-q", f"{query}"] - target_dir = shlex.quote( self._fm_state.tab.get_current_directory() ) - command = ["python", f"{self.path}/utils/search.py", "-t", "grep_search", "-d", f"{target_dir}", "-q", f"{query}"] self._spinner.start() + self._grep_proc = subprocess.Popen(command, cwd=self.path, stdin=None, stdout=None, stderr=None) + def _load_grep_ui(self, data): Gtk.main_iteration() diff --git a/plugins/searcher/utils/ipc_server.py b/plugins/searcher/utils/ipc_server.py index b4c7f6c..6c4d0cf 100644 --- a/plugins/searcher/utils/ipc_server.py +++ b/plugins/searcher/utils/ipc_server.py @@ -60,13 +60,6 @@ class IPCServer: msg = conn.recv() try: - if "SEARCH_DONE|" in msg: - ts, ret_code = msg.split("SEARCH_DONE|")[1].strip().split("|", 1) - timestamp = float(ts) - if self.fsearch_time_stamp or self.grep_time_stamp: - if (timestamp > self.fsearch_time_stamp) or (timestamp > self.grep_time_stamp): - GLib.idle_add(self.stop_spinner, (ret_code,), priority=GLib.PRIORITY_HIGH_IDLE) - if "SEARCH|" in msg: ts, file = msg.split("SEARCH|")[1].strip().split("|", 1) timestamp = float(ts) @@ -78,6 +71,10 @@ class IPCServer: timestamp = float(ts) if data and (timestamp > self.grep_time_stamp): GLib.idle_add(self._load_grep_ui, data, priority=GLib.PRIORITY_HIGH_IDLE) + + if "SEARCH_DONE|" in msg: + ts, ret_code = msg.split("SEARCH_DONE|")[1].strip().split("|", 1) + GLib.idle_add(self.stop_spinner, (ret_code,), priority=GLib.PRIORITY_HIGH_IDLE) except Exception as e: print( repr(e) ) diff --git a/plugins/searcher/utils/search.py b/plugins/searcher/utils/search.py index 79c1e11..19b23d5 100755 --- a/plugins/searcher/utils/search.py +++ b/plugins/searcher/utils/search.py @@ -32,8 +32,12 @@ dt = datetime.now() ts = datetime.timestamp(dt) +def _log(message: str = "No message passed in...") -> None: + print(message) + + def send_ipc_message(message) -> None: - conn = Client(address=_ipc_address, family="AF_UNIX", authkey=_ipc_authkey) + conn = Client(address = _ipc_address, family = "AF_UNIX", authkey = _ipc_authkey) conn.send(message) conn.close() @@ -41,9 +45,11 @@ def send_ipc_message(message) -> None: time.sleep(0.05) -def file_search(path, query): +def file_search(path: str = None, query: str = None) -> None: + if not path or not query: return + try: - for _path, _dir, _files in os.walk(path, topdown = True): + for _path, _dir, _files in os.walk(path, topdown = True, onerror = _log, followlinks = True): for file in _files: if query in file.lower(): target = os.path.join(_path, file) @@ -54,14 +60,13 @@ def file_search(path, query): traceback.print_exc() -def grep_search(target=None, query=None): - if not query or not target: - return +def grep_search(target: str = None, query: str = None): + if not target or not query: return # NOTE: -n = provide line numbers, -R = Search recursive in given target # -i = insensitive, -F = don't do regex parsing. (Treat as raw string) command = ["grep", "-n", "-R", "-i", "-F", query, target] - proc = subprocess.Popen(command, stdout=subprocess.PIPE, encoding="utf-8") + proc = subprocess.Popen(command, stdout = subprocess.PIPE, encoding = "utf-8") raw_data = proc.communicate()[0].strip() proc_data = raw_data.split("\n") # NOTE: Will return data AFTER completion (if any) collection = {} @@ -85,17 +90,23 @@ def grep_search(target=None, query=None): except Exception as e: traceback.print_exc() + proc.terminate() data = f"GREP|{ts}|{json.dumps(collection, separators=(',', ':'), indent=4)}" send_ipc_message(data) collection = {} def search(args): + path = args.dir + if (path[0] == "'" and path[-1] == "'") or \ + path[0] == '"' and path[-1] == '"': + path = path[1:-1] + if args.type == "file_search": - file_search(args.dir, args.query.lower()) + file_search(path, args.query.lower()) if args.type == "grep_search": - grep_search(args.dir, args.query.encode("utf-8")) + grep_search(path, args.query.encode("utf-8")) if __name__ == "__main__": diff --git a/src/versions/solarfm-0.0.1/solarfm/core/controller.py b/src/versions/solarfm-0.0.1/solarfm/core/controller.py index 04678b1..b26c46b 100644 --- a/src/versions/solarfm-0.0.1/solarfm/core/controller.py +++ b/src/versions/solarfm-0.0.1/solarfm/core/controller.py @@ -113,8 +113,7 @@ class Controller(UIMixin, SignalsMixins, Controller_Data): def do_action_from_menu_controls(self, _action=None, eve=None): - if not _action: - return + if not _action: return if not isinstance(_action, str): action = _action.get_name() diff --git a/src/versions/solarfm-0.0.1/solarfm/core/mixins/ui/tab_mixin.py b/src/versions/solarfm-0.0.1/solarfm/core/mixins/ui/tab_mixin.py index 8194410..e88f393 100644 --- a/src/versions/solarfm-0.0.1/solarfm/core/mixins/ui/tab_mixin.py +++ b/src/versions/solarfm-0.0.1/solarfm/core/mixins/ui/tab_mixin.py @@ -1,18 +1,19 @@ # Python imports import os import gc +import time # Lib imports import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk +from gi.repository import GLib # Application imports from .grid_mixin import GridMixin - class TabMixin(GridMixin): """docstring for TabMixin""" @@ -173,27 +174,7 @@ class TabMixin(GridMixin): path = widget.get_text() if isinstance(focused_obj, Gtk.Entry): - path_menu_buttons = self.builder.get_object("path_menu_buttons") - query = widget.get_text().replace(dir, "") - files = tab.get_files() + tab.get_hidden() - - self.clear_children(path_menu_buttons) - show_path_menu = False - for file, hash, size in files: - if os.path.isdir(f"{dir}{file}"): - if query.lower() in file.lower(): - button = Gtk.Button(label=file) - button.show() - button.connect("clicked", self.set_path_entry) - path_menu_buttons.add(button) - show_path_menu = True - - if not show_path_menu: - event_system.emit("hide_path_menu") - else: - event_system.emit("show_path_menu") - widget.grab_focus_without_selecting() - widget.set_position(-1) + self.process_path_menu(widget, tab, dir) if path.endswith(".") or path == dir: return @@ -205,21 +186,52 @@ class TabMixin(GridMixin): icon_grid.clear_and_set_new_store() self.update_tab(tab_label, tab, icon_grid.get_store(), wid, tid) - try: - widget.grab_focus_without_selecting() - widget.set_position(-1) - except Exception as e: - pass + def process_path_menu(self, gtk_entry, tab, dir): + path_menu_buttons = self.builder.get_object("path_menu_buttons") + query = gtk_entry.get_text().replace(dir, "") + files = tab.get_files() + tab.get_hidden() - def set_path_entry(self, button=None, eve=None): + self.clear_children(path_menu_buttons) + show_path_menu = False + for file, hash, size in files: + if os.path.isdir(f"{dir}{file}"): + if query.lower() in file.lower(): + button = Gtk.Button(label=file) + button.show() + button.connect("clicked", self.set_path_entry) + path_menu_buttons.add(button) + show_path_menu = True + + if not show_path_menu: + event_system.emit("hide_path_menu") + else: + event_system.emit("show_path_menu") + buttons = path_menu_buttons.get_children() + + if len(buttons) == 1: + self.slowed_focus(buttons[0]) + + @daemon_threaded + def slowed_focus(self, button): + time.sleep(0.05) + GLib.idle_add(self.do_focused_click, *(button,)) + + def do_focused_click(self, button): + button.grab_focus() + button.clicked() + + def set_path_entry(self, button = None, eve = None): + self.path_auto_filled = True state = self.get_current_state() path = f"{state.tab.get_current_directory()}/{button.get_label()}" path_entry = self.builder.get_object("path_entry") + path_entry.set_text(path) path_entry.grab_focus_without_selecting() path_entry.set_position(-1) event_system.emit("hide_path_menu") + def show_hide_hidden_files(self): wid, tid = self.fm_controller.get_active_wid_and_tid() tab = self.get_fm_window(wid).get_tab_by_id(tid) diff --git a/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/tab_mixin.py b/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/tab_mixin.py index a75718c..1bf3b50 100644 --- a/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/tab_mixin.py +++ b/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/tab_mixin.py @@ -1,17 +1,19 @@ # Python imports import os +import gc +import time # Lib imports import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk +from gi.repository import GLib # Application imports from .grid_mixin import GridMixin - class TabMixin(GridMixin): """docstring for TabMixin""" @@ -85,6 +87,7 @@ class TabMixin(GridMixin): del watcher del tab + gc.collect() if not settings_manager.is_trace_debug(): self.fm_controller.save_state() @@ -173,27 +176,7 @@ class TabMixin(GridMixin): path = widget.get_text() if isinstance(focused_obj, Gtk.Entry): - path_menu_buttons = self.builder.get_object("path_menu_buttons") - query = widget.get_text().replace(dir, "") - files = tab.get_files() + tab.get_hidden() - - self.clear_children(path_menu_buttons) - show_path_menu = False - for file, hash, size in files: - if os.path.isdir(f"{dir}{file}"): - if query.lower() in file.lower(): - button = Gtk.Button(label=file) - button.show() - button.connect("clicked", self.set_path_entry) - path_menu_buttons.add(button) - show_path_menu = True - - if not show_path_menu: - event_system.emit("hide_path_menu") - else: - event_system.emit("show_path_menu") - widget.grab_focus_without_selecting() - widget.set_position(-1) + self.process_path_menu(widget, tab, dir) if path.endswith(".") or path == dir: return @@ -201,18 +184,50 @@ class TabMixin(GridMixin): if not tab.set_path(path): return + icon_grid = self.get_icon_grid_from_notebook(notebook, f"{wid}|{tid}") + icon_grid.clear_and_set_new_store() self.update_tab(tab_label, tab, store, wid, tid) - try: - widget.grab_focus_without_selecting() - widget.set_position(-1) - except Exception as e: - pass + def process_path_menu(self, gtk_entry, tab, dir): + path_menu_buttons = self.builder.get_object("path_menu_buttons") + query = gtk_entry.get_text().replace(dir, "") + files = tab.get_files() + tab.get_hidden() - def set_path_entry(self, button=None, eve=None): + self.clear_children(path_menu_buttons) + show_path_menu = False + for file, hash, size in files: + if os.path.isdir(f"{dir}{file}"): + if query.lower() in file.lower(): + button = Gtk.Button(label=file) + button.show() + button.connect("clicked", self.set_path_entry) + path_menu_buttons.add(button) + show_path_menu = True + + if not show_path_menu: + event_system.emit("hide_path_menu") + else: + event_system.emit("show_path_menu") + buttons = path_menu_buttons.get_children() + + if len(buttons) == 1: + self.slowed_focus(buttons[0]) + + @daemon_threaded + def slowed_focus(self, button): + time.sleep(0.05) + GLib.idle_add(self.do_focused_click, *(button,)) + + def do_focused_click(self, button): + button.grab_focus() + button.clicked() + + def set_path_entry(self, button = None, eve = None): + self.path_auto_filled = True state = self.get_current_state() path = f"{state.tab.get_current_directory()}/{button.get_label()}" path_entry = self.builder.get_object("path_entry") + path_entry.set_text(path) path_entry.grab_focus_without_selecting() path_entry.set_position(-1) diff --git a/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/window_mixin.py b/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/window_mixin.py index 4dc0b95..e8ad629 100644 --- a/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/window_mixin.py +++ b/src/versions/solarfm-0.0.1/solarfm/core/widgets/files_view/window_mixin.py @@ -106,7 +106,7 @@ class WindowMixin(TabMixin): state = self.get_current_state() notebook = self.builder.get_object(f"window_{state.wid}") - tab_label = self.get_tab_label(notebook, icons_grid) + tab_label = self.get_tab_label(notebook, state.icon_grid) fileName = state.store[item][1] dir = state.tab.get_current_directory() @@ -114,7 +114,8 @@ class WindowMixin(TabMixin): if isdir(file): state.tab.set_path(file) - self.update_tab(tab_label, state.tab, state.store, state.wid, state.tid) + state.icon_grid.clear_and_set_new_store() + self.update_tab(tab_label, state.tab, state.icon_grid.get_store(), state.wid, state.tid) else: event_system.emit("open_files") except WindowException as e: diff --git a/src/versions/solarfm-0.0.1/solarfm/core/window.py b/src/versions/solarfm-0.0.1/solarfm/core/window.py index f9a5d93..5960f10 100644 --- a/src/versions/solarfm-0.0.1/solarfm/core/window.py +++ b/src/versions/solarfm-0.0.1/solarfm/core/window.py @@ -94,4 +94,5 @@ class Window(Gtk.ApplicationWindow): settings_manager.clear_pid() time.sleep(event_sleep_time) + Gtk.main_quit() diff --git a/src/versions/solarfm-0.0.1/solarfm/data.txt b/src/versions/solarfm-0.0.1/solarfm/data.txt new file mode 100644 index 0000000..e33e487 --- /dev/null +++ b/src/versions/solarfm-0.0.1/solarfm/data.txt @@ -0,0 +1,11 @@ + +:672: size=5717 KiB, count=60317, average=97 B +:241: size=534 KiB, count=5538, average=99 B +/usr/lib/python3.10/abc.py:106: size=77.9 KiB, count=290, average=275 B +:128: size=62.1 KiB, count=532, average=119 B +/usr/lib/python3.10/sre_compile.py:804: size=57.7 KiB, count=110, average=537 B +/home/abaddon/Coding/Projects/Active/Python_Projects/000_Usable/gtk/SolarFM/src/versions/solarfm-0.0.1/solarfm/./shellfm/windows/tabs/tab.py:79: size=56.4 KiB, count=875, average=66 B +/usr/lib/python3.10/site-packages/gi/types.py:52: size=54.0 KiB, count=509, average=109 B +/usr/lib/python3.10/site-packages/gi/module.py:207: size=49.6 KiB, count=233, average=218 B +/usr/lib/python3.10/site-packages/gi/types.py:51: size=40.1 KiB, count=733, average=56 B +:359: size=38.6 KiB, count=549, average=72 B \ No newline at end of file