From cddecb7ce771f34b6488f0b0242f24536dad411f Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Fri, 15 Aug 2025 22:23:51 -0500 Subject: [PATCH] Fixing vod thumbnailer; handling signal removal on tab close --- src/solarfm/core/mixins/ui/tab_mixin.py | 46 +++--------------- .../core/widgets/files_view/tab_mixin.py | 47 +++---------------- src/solarfm/core/widgets/icon_grid_widget.py | 44 ++++++++--------- src/solarfm/core/widgets/tab_header_widget.py | 21 +++++---- 4 files changed, 49 insertions(+), 109 deletions(-) diff --git a/src/solarfm/core/mixins/ui/tab_mixin.py b/src/solarfm/core/mixins/ui/tab_mixin.py index 70e53fe..6ba6fdf 100644 --- a/src/solarfm/core/mixins/ui/tab_mixin.py +++ b/src/solarfm/core/mixins/ui/tab_mixin.py @@ -1,6 +1,5 @@ # Python imports import os -import gc import time # Lib imports @@ -52,14 +51,6 @@ class TabMixin(GridMixin): event_system.emit("set_window_title", (tab.get_current_directory(),)) self.set_file_watcher(tab) - tab_widget = None - scroll, store = None, None - index = None - notebook = None - path_entry = None - tab = None - ctx = None - def get_tab_widget(self, tab): tab_widget = self.create_tab_widget() @@ -72,58 +63,35 @@ class TabMixin(GridMixin): def close_tab(self, button, eve = None): notebook = button.get_parent().get_parent() - if notebook.get_n_pages() == 1: - notebook = None - return + if notebook.get_n_pages() == 1: return tab_box = button.get_parent() wid = int(notebook.get_name()[-1]) tid = self.get_id_from_tab_box(tab_box) scroll = self.builder.get_object(f"{wid}|{tid}", use_gtk = False) icon_grid = scroll.get_children()[0] - store = icon_grid.get_store() tab = self.get_fm_window(wid).get_tab_by_id(tid) watcher = tab.get_dir_watcher() watcher.cancel() self.get_fm_window(wid).delete_tab_by_id(tid) + tab_box.unload_signals() + icon_grid.unload_signals() + icon_grid.set_model(None) + self.builder.dereference_object(f"{wid}|{tid}|icon_grid") self.builder.dereference_object(f"{wid}|{tid}") - iter = store.get_iter_first() - while iter: - next_iter = store.iter_next(iter) - store.unref_node(iter) - iter = next_iter - - store.clear() - store.run_dispose() - - icon_grid.set_model(None) - icon_grid.run_dispose() - scroll.run_dispose() - tab_box.run_dispose() - - iter = None - wid, tid = None, None - store = None - icon_grid = None - scroll = None - tab_box = None - watcher = None - tab = None - notebook = None + notebook.remove_page( notebook.page_num(scroll) ) if not settings_manager.is_trace_debug(): self.fm_controller.save_state() self.set_window_title() - gc.collect() - # NOTE: Not actually getting called even tho set in the glade file... def on_tab_dnded(self, notebook, page, x, y): - ... + print("Create new window on tab dnd outside stub...") def on_tab_reorder(self, child, page_num, new_index): wid, tid = page_num.get_name().split("|") diff --git a/src/solarfm/core/widgets/files_view/tab_mixin.py b/src/solarfm/core/widgets/files_view/tab_mixin.py index 8a49f94..e72c064 100644 --- a/src/solarfm/core/widgets/files_view/tab_mixin.py +++ b/src/solarfm/core/widgets/files_view/tab_mixin.py @@ -1,6 +1,5 @@ # Python imports import os -import gc import time # Lib imports @@ -52,15 +51,6 @@ class TabMixin(GridMixin): event_system.emit("set_window_title", (tab.get_current_directory(),)) self.set_file_watcher(tab) - tab_widget = None - scroll, store = None, None - index = None - notebook = None - # path_entry = None - tab = None - ctx = None - - def get_tab_widget(self, tab): tab_widget = self.create_tab_widget() tab_widget.tab_id = tab.get_id() @@ -72,56 +62,33 @@ class TabMixin(GridMixin): def close_tab(self, button, eve = None): notebook = button.get_parent().get_parent() - if notebook.get_n_pages() == 1: - notebook = None - return + if notebook.get_n_pages() == 1: return tab_box = button.get_parent() wid = int(notebook.get_name()[-1]) tid = self.get_id_from_tab_box(tab_box) scroll = self.builder.get_object(f"{wid}|{tid}", use_gtk = False) icon_grid = scroll.get_children()[0] - store = icon_grid.get_model() tab = self.get_fm_window(wid).get_tab_by_id(tid) watcher = tab.get_dir_watcher() watcher.cancel() self.get_fm_window(wid).delete_tab_by_id(tid) + tab_box.unload_signals() + icon_grid.unload_signals() + icon_grid.set_model(None) + self.builder.dereference_object(f"{wid}|{tid}|icon_grid") self.builder.dereference_object(f"{wid}|{tid}") - iter = store.get_iter_first() - while iter: - next_iter = store.iter_next(iter) - store.unref_node(iter) - iter = next_iter - - store.clear() - store.run_dispose() - - icon_grid.set_model(None) - icon_grid.run_dispose() - scroll.run_dispose() - tab_box.run_dispose() - - iter = None - wid, tid = None, None - store = None - icon_grid = None - scroll = None - tab_box = None - watcher = None - tab = None - notebook = None + notebook.remove_page( notebook.page_num(scroll) ) if not settings_manager.is_trace_debug(): self.fm_controller.save_state() self.set_window_title() - gc.collect() - # NOTE: Not actually getting called even tho set in the glade file... def on_tab_dnded(self, notebook, page, x, y): ... @@ -311,4 +278,4 @@ class TabMixin(GridMixin): self.builder.get_object("refresh_tab").released() wid, tid = None, None - tab = None + tab = None \ No newline at end of file diff --git a/src/solarfm/core/widgets/icon_grid_widget.py b/src/solarfm/core/widgets/icon_grid_widget.py index 6114077..bc487a0 100644 --- a/src/solarfm/core/widgets/icon_grid_widget.py +++ b/src/solarfm/core/widgets/icon_grid_widget.py @@ -20,6 +20,8 @@ class IconGridWidget(Gtk.IconView): def __init__(self): super(IconGridWidget, self).__init__() + self._handler_ids = [] + self._setup_styling() self._setup_signals() self._set_up_dnd() @@ -52,12 +54,12 @@ class IconGridWidget(Gtk.IconView): grid_on_drag_data_received, grid_on_drag_motion): - self.connect("button_release_event", grid_icon_single_click) - self.connect("item-activated", grid_icon_double_click) - self.connect("selection-changed", grid_set_selected_items) - self.connect("drag-data-get", grid_on_drag_set) - self.connect("drag-data-received", grid_on_drag_data_received) - self.connect("drag-motion", grid_on_drag_motion) + self._handler_ids.append(self.connect("button_release_event", grid_icon_single_click)) + self._handler_ids.append(self.connect("item-activated", grid_icon_double_click)) + self._handler_ids.append(self.connect("selection-changed", grid_set_selected_items)) + self._handler_ids.append(self.connect("drag-data-get", grid_on_drag_set)) + self._handler_ids.append(self.connect("drag-data-received", grid_on_drag_data_received)) + self._handler_ids.append(self.connect("drag-motion", grid_on_drag_motion)) def _load_widgets(self): self.clear_and_set_new_store() @@ -75,20 +77,18 @@ class IconGridWidget(Gtk.IconView): return self.get_model() def clear_and_set_new_store(self): - store = self.get_model() - if store: - iter = store.get_iter_first() - while iter: - next_iter = store.iter_next(iter) - store.unref_node(iter) - iter = next_iter - - store.clear() - store.run_dispose() - store = None - self.set_model(None) - store = Gtk.ListStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None) - # store = Gtk.ListStore(Gtk.DirectoryList) - self.set_model(store) - store = None \ No newline at end of file + self.set_model( + Gtk.ListStore( + GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None + ) + ) + + def unload_signals(self): + self.unset_model_drag_dest() + self.unset_model_drag_source() + + for handle_id in self._handler_ids: + self.disconnect(handle_id) + + self._handler_ids.clear() diff --git a/src/solarfm/core/widgets/tab_header_widget.py b/src/solarfm/core/widgets/tab_header_widget.py index 729db6f..7f3f1c8 100644 --- a/src/solarfm/core/widgets/tab_header_widget.py +++ b/src/solarfm/core/widgets/tab_header_widget.py @@ -15,7 +15,7 @@ class TabHeaderWidget(Gtk.Box): def __init__(self, close_tab): super(TabHeaderWidget, self).__init__() - self._close_tab = close_tab # NOTE: Close method in tab_mixin + self._close_tab = close_tab # NOTE: Close method is from tab_mixin self._setup_styling() self._setup_signals() @@ -30,19 +30,24 @@ class TabHeaderWidget(Gtk.Box): ... def _load_widgets(self): - self.label = Gtk.Label() - close = Gtk.Button() - icon = Gtk.Image(stock=Gtk.STOCK_CLOSE) + self.label = Gtk.Label() + self.close_btn = Gtk.Button() + icon = Gtk.Image(stock = Gtk.STOCK_CLOSE) self.label.set_xalign(0.0) self.label.set_margin_left(25) self.label.set_margin_right(25) self.label.set_hexpand(True) - close.connect("released", self._close_tab) + self._handler_id = self.close_btn.connect("released", self._close_tab) - close.add(icon) + self.close_btn.add(icon) self.add(self.label) - self.add(close) + self.add(self.close_btn) - self.show_all() \ No newline at end of file + self.show_all() + + def unload_signals(self): + self.close_btn.disconnect(self._handler_id) + self._close_tab = None + self._handler_id = None \ No newline at end of file