SolarFM/src/versions/solarfm-0.0.1/solarfm/core/mixins/signals/file_action_signals_mixin.py

106 lines
4.1 KiB
Python
Raw Normal View History

2021-11-22 22:24:44 +00:00
# Python imports
import time
2021-11-22 22:24:44 +00:00
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
from gi.repository import Gio
2021-11-22 22:24:44 +00:00
# Application imports
class FileActionSignalsMixin:
"""docstring for FileActionSignalsMixin"""
def set_file_watcher(self, tab):
if tab.get_dir_watcher():
watcher = tab.get_dir_watcher()
2021-11-22 22:24:44 +00:00
watcher.cancel()
if settings.is_debug():
logger.debug(f"Watcher Is Cancelled: {watcher.is_cancelled()}")
2021-11-22 22:24:44 +00:00
cur_dir = tab.get_current_directory()
2021-11-30 06:21:50 +00:00
2021-12-25 09:20:39 +00:00
dir_watcher = Gio.File.new_for_path(cur_dir) \
2021-11-30 06:21:50 +00:00
.monitor_directory(Gio.FileMonitorFlags.WATCH_MOVES, Gio.Cancellable())
2021-11-22 22:24:44 +00:00
wid = tab.get_wid()
tid = tab.get_id()
2021-11-22 22:24:44 +00:00
dir_watcher.connect("changed", self.dir_watch_updates, (f"{wid}|{tid}",))
tab.set_dir_watcher(dir_watcher)
2021-11-22 22:24:44 +00:00
# NOTE: Too lazy to impliment a proper update handler and so just regen store and update tab.
2022-02-17 16:13:27 +00:00
# Use a lock system to prevent too many update calls for certain instances but user can manually refresh if they have urgency
2021-11-22 22:24:44 +00:00
def dir_watch_updates(self, file_monitor, file, other_file=None, eve_type=None, data=None):
if eve_type == Gio.FileMonitorEvent.CHANGES_DONE_HINT:
if eve_type in [Gio.FileMonitorEvent.CREATED, Gio.FileMonitorEvent.DELETED,
Gio.FileMonitorEvent.RENAMED, Gio.FileMonitorEvent.MOVED_IN,
Gio.FileMonitorEvent.MOVED_OUT]:
logger.debug(eve_type)
2021-11-30 06:21:50 +00:00
if eve_type in [Gio.FileMonitorEvent.MOVED_IN, Gio.FileMonitorEvent.MOVED_OUT]:
self.update_on_soft_lock_end(data[0])
elif data[0] in self.soft_update_lock.keys():
self.soft_update_lock[data[0]]["last_update_time"] = time.time()
else:
self.soft_lock_countdown(data[0])
2021-11-22 22:24:44 +00:00
2022-02-17 16:13:27 +00:00
@threaded
def soft_lock_countdown(self, tab_widget):
self.soft_update_lock[tab_widget] = { "last_update_time": time.time()}
2021-11-22 22:24:44 +00:00
2022-02-17 16:13:27 +00:00
lock = True
while lock:
time.sleep(0.6)
last_update_time = self.soft_update_lock[tab_widget]["last_update_time"]
2022-02-17 16:13:27 +00:00
current_time = time.time()
if (current_time - last_update_time) > 0.6:
lock = False
self.soft_update_lock.pop(tab_widget, None)
GLib.idle_add(self.update_on_soft_lock_end, *(tab_widget,))
2022-02-17 16:13:27 +00:00
def update_on_soft_lock_end(self, tab_widget):
wid, tid = tab_widget.split("|")
2022-02-17 16:13:27 +00:00
notebook = self.builder.get_object(f"window_{wid}")
tab = self.get_fm_window(wid).get_tab_by_id(tid)
icon_grid = self.builder.get_object(f"{wid}|{tid}|icon_grid")
store = icon_grid.get_model()
_store, tab_widget_label = self.get_store_and_label_from_notebook(notebook, f"{wid}|{tid}")
2022-02-17 16:13:27 +00:00
tab.load_directory()
self.load_store(tab, store)
2022-02-17 16:13:27 +00:00
tab_widget_label.set_label(tab.get_end_of_path())
2022-03-07 03:27:47 +00:00
state = self.get_current_state()
if [wid, tid] in [state.wid, state.tid]:
self.set_bottom_labels(tab)
2021-12-07 07:48:52 +00:00
def do_file_search(self, widget, eve=None):
2022-10-27 22:23:27 +00:00
if not self.ctrl_down and not self.shift_down and not self.alt_down:
target = widget.get_name()
notebook = self.builder.get_object(target)
page = notebook.get_current_page()
nth_page = notebook.get_nth_page(page)
icon_grid = nth_page.get_children()[0]
wid, tid = icon_grid.get_name().split("|")
tab = self.get_fm_window(wid).get_tab_by_id(tid)
query = widget.get_text().lower()
icon_grid.unselect_all()
for i, file in enumerate(tab.get_files()):
if query and query in file[0].lower():
path = Gtk.TreePath().new_from_indices([i])
icon_grid.select_path(path)
items = icon_grid.get_selected_items()
2022-12-07 05:36:10 +00:00
if len(items) > 0:
icon_grid.scroll_to_path(items[0], False, 0.5, 0.5)