diff --git a/src/solarfm/core/mixins/signals/file_action_signals_mixin.py b/src/solarfm/core/mixins/signals/file_action_signals_mixin.py index 6767b36..775a54f 100644 --- a/src/solarfm/core/mixins/signals/file_action_signals_mixin.py +++ b/src/solarfm/core/mixins/signals/file_action_signals_mixin.py @@ -39,7 +39,6 @@ class FileActionSignalsMixin: 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) if eve_type in [Gio.FileMonitorEvent.MOVED_IN, Gio.FileMonitorEvent.MOVED_OUT]: self.update_on_soft_lock_end(data[0]) diff --git a/src/solarfm/core/mixins/ui/grid_mixin.py b/src/solarfm/core/mixins/ui/grid_mixin.py index 58c476d..be7d7a3 100644 --- a/src/solarfm/core/mixins/ui/grid_mixin.py +++ b/src/solarfm/core/mixins/ui/grid_mixin.py @@ -7,6 +7,7 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from gi.repository import GLib +from gi.repository import Gio # Application imports from ...widgets.tab_header_widget import TabHeaderWidget @@ -19,6 +20,18 @@ class GridMixin: """docstring for GridMixin""" def load_store(self, tab, store, save_state = False, use_generator = False): + # dir = tab.get_current_directory() + # file = Gio.File.new_for_path(dir) + # dir_list = Gtk.DirectoryList.new("standard::*", file) + # store.set(dir_list) + + # file = Gio.File.new_for_path(dir) + # for file in file.enumerate_children("standard::*", Gio.FILE_ATTRIBUTE_STANDARD_NAME, None): + # store.append(file) + + # return + + dir = tab.get_current_directory() files = tab.get_files() @@ -45,14 +58,24 @@ class GridMixin: asyncio.run( self.create_icons(tab, store, dir, files) ) async def create_icons(self, tab, store, dir, files): - tasks = [self.update_store(i, store, dir, tab, file[0]) for i, file in enumerate(files)] + icons = [self.get_icon(tab, dir, file[0]) for file in files] + data = await asyncio.gather(*icons) + tasks = [self.update_store(i, store, icon) for i, icon in enumerate(data)] await asyncio.gather(*tasks) + GLib.idle_add(Gtk.main_iteration) - async def update_store(self, i, store, dir, tab, file): - icon = tab.create_icon(dir, file) + async def update_store(self, i, store, icon): itr = store.get_iter(i) - GLib.idle_add(store.set_value, itr, 0, icon) + GLib.idle_add(self.insert_store, store, itr, icon) + + def insert_store(self, store, itr, icon): + store.set_value(itr, 0, icon) + # Note: If the function returns GLib.SOURCE_REMOVE or False it is automatically removed from the list of event sources and will not be called again. + return False + + async def get_icon(self, tab, dir, file): + return tab.create_icon(dir, file) def create_tab_widget(self, tab): return TabHeaderWidget(tab, self.close_tab) diff --git a/src/solarfm/core/mixins/ui/tab_mixin.py b/src/solarfm/core/mixins/ui/tab_mixin.py index aab38bd..ffd7f2b 100644 --- a/src/solarfm/core/mixins/ui/tab_mixin.py +++ b/src/solarfm/core/mixins/ui/tab_mixin.py @@ -236,4 +236,4 @@ class TabMixin(GridMixin): tab = self.get_fm_window(wid).get_tab_by_id(tid) tab.set_hiding_hidden(not tab.is_hiding_hidden()) tab.load_directory() - self.builder.get_object("refresh_tab").released() + self.builder.get_object("refresh_tab").released() \ No newline at end of file diff --git a/src/solarfm/core/widgets/files_view/grid_mixin.py b/src/solarfm/core/widgets/files_view/grid_mixin.py index b6ab2f8..dd11204 100644 --- a/src/solarfm/core/widgets/files_view/grid_mixin.py +++ b/src/solarfm/core/widgets/files_view/grid_mixin.py @@ -7,6 +7,7 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from gi.repository import GLib +from gi.repository import Gio # Application imports from ...widgets.tab_header_widget import TabHeaderWidget @@ -19,6 +20,18 @@ class GridMixin: """docstring for GridMixin""" def load_store(self, tab, store, save_state = False, use_generator = False): + # dir = tab.get_current_directory() + # file = Gio.File.new_for_path(dir) + # dir_list = Gtk.DirectoryList.new("standard::*", file) + # store.set(dir_list) + + # file = Gio.File.new_for_path(dir) + # for file in file.enumerate_children("standard::*", Gio.FILE_ATTRIBUTE_STANDARD_NAME, None): + # store.append(file) + + # return + + dir = tab.get_current_directory() files = tab.get_files() @@ -32,6 +45,7 @@ class GridMixin: if save_state and not trace_debug: self.fm_controller.save_state() + def generate_icons(self, tab, store, dir, files): try: loop = asyncio.get_running_loop() @@ -44,13 +58,24 @@ class GridMixin: asyncio.run( self.create_icons(tab, store, dir, files) ) async def create_icons(self, tab, store, dir, files): - tasks = [self.update_store(i, store, dir, tab, file[0]) for i, file in enumerate(files)] + icons = [self.get_icon(tab, dir, file[0]) for file in files] + data = await asyncio.gather(*icons) + tasks = [self.update_store(i, store, icon) for i, icon in enumerate(data)] await asyncio.gather(*tasks) - async def update_store(self, i, store, dir, tab, file): - icon = tab.create_icon(dir, file) + GLib.idle_add(Gtk.main_iteration) + + async def update_store(self, i, store, icon): itr = store.get_iter(i) - GLib.idle_add(store.set_value, itr, 0, icon) + GLib.idle_add(self.insert_store, store, itr, icon) + + def insert_store(self, store, itr, icon): + store.set_value(itr, 0, icon) + # Note: If the function returns GLib.SOURCE_REMOVE or False it is automatically removed from the list of event sources and will not be called again. + return False + + async def get_icon(self, tab, dir, file): + return tab.create_icon(dir, file) def create_tab_widget(self, tab): return TabHeaderWidget(tab, self.close_tab) diff --git a/src/solarfm/core/widgets/icon_grid_widget.py b/src/solarfm/core/widgets/icon_grid_widget.py index 51088b3..2d25921 100644 --- a/src/solarfm/core/widgets/icon_grid_widget.py +++ b/src/solarfm/core/widgets/icon_grid_widget.py @@ -77,4 +77,5 @@ class IconGridWidget(Gtk.IconView): def clear_and_set_new_store(self): self.set_model(None) store = Gtk.ListStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None) - self.set_model(store) + # store = Gtk.ListStore(Gtk.DirectoryList) + self.set_model(store) \ No newline at end of file diff --git a/src/solarfm/shellfm/windows/tabs/icons/icon.py b/src/solarfm/shellfm/windows/tabs/icons/icon.py index 19e3faa..1693293 100644 --- a/src/solarfm/shellfm/windows/tabs/icons/icon.py +++ b/src/solarfm/shellfm/windows/tabs/icons/icon.py @@ -138,6 +138,7 @@ class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): def _call_gtk_thread(event, result): result.append( self.get_system_thumbnail(full_path, size) ) event.set() + return False result = [] event = threading.Event()