Fixing vod thumbnailer; handling signal removal on tab close

This commit is contained in:
2025-08-15 22:23:51 -05:00
parent e382f73371
commit cddecb7ce7
4 changed files with 49 additions and 109 deletions

View File

@@ -1,6 +1,5 @@
# Python imports # Python imports
import os import os
import gc
import time import time
# Lib imports # Lib imports
@@ -52,14 +51,6 @@ class TabMixin(GridMixin):
event_system.emit("set_window_title", (tab.get_current_directory(),)) event_system.emit("set_window_title", (tab.get_current_directory(),))
self.set_file_watcher(tab) 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): def get_tab_widget(self, tab):
tab_widget = self.create_tab_widget() tab_widget = self.create_tab_widget()
@@ -72,58 +63,35 @@ class TabMixin(GridMixin):
def close_tab(self, button, eve = None): def close_tab(self, button, eve = None):
notebook = button.get_parent().get_parent() notebook = button.get_parent().get_parent()
if notebook.get_n_pages() == 1: if notebook.get_n_pages() == 1: return
notebook = None
return
tab_box = button.get_parent() tab_box = button.get_parent()
wid = int(notebook.get_name()[-1]) wid = int(notebook.get_name()[-1])
tid = self.get_id_from_tab_box(tab_box) tid = self.get_id_from_tab_box(tab_box)
scroll = self.builder.get_object(f"{wid}|{tid}", use_gtk = False) scroll = self.builder.get_object(f"{wid}|{tid}", use_gtk = False)
icon_grid = scroll.get_children()[0] icon_grid = scroll.get_children()[0]
store = icon_grid.get_store()
tab = self.get_fm_window(wid).get_tab_by_id(tid) tab = self.get_fm_window(wid).get_tab_by_id(tid)
watcher = tab.get_dir_watcher() watcher = tab.get_dir_watcher()
watcher.cancel() watcher.cancel()
self.get_fm_window(wid).delete_tab_by_id(tid) 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}|icon_grid")
self.builder.dereference_object(f"{wid}|{tid}") self.builder.dereference_object(f"{wid}|{tid}")
iter = store.get_iter_first() notebook.remove_page( notebook.page_num(scroll) )
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
if not settings_manager.is_trace_debug(): if not settings_manager.is_trace_debug():
self.fm_controller.save_state() self.fm_controller.save_state()
self.set_window_title() 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): 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): def on_tab_reorder(self, child, page_num, new_index):
wid, tid = page_num.get_name().split("|") wid, tid = page_num.get_name().split("|")

View File

@@ -1,6 +1,5 @@
# Python imports # Python imports
import os import os
import gc
import time import time
# Lib imports # Lib imports
@@ -52,15 +51,6 @@ class TabMixin(GridMixin):
event_system.emit("set_window_title", (tab.get_current_directory(),)) event_system.emit("set_window_title", (tab.get_current_directory(),))
self.set_file_watcher(tab) 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): def get_tab_widget(self, tab):
tab_widget = self.create_tab_widget() tab_widget = self.create_tab_widget()
tab_widget.tab_id = tab.get_id() tab_widget.tab_id = tab.get_id()
@@ -72,56 +62,33 @@ class TabMixin(GridMixin):
def close_tab(self, button, eve = None): def close_tab(self, button, eve = None):
notebook = button.get_parent().get_parent() notebook = button.get_parent().get_parent()
if notebook.get_n_pages() == 1: if notebook.get_n_pages() == 1: return
notebook = None
return
tab_box = button.get_parent() tab_box = button.get_parent()
wid = int(notebook.get_name()[-1]) wid = int(notebook.get_name()[-1])
tid = self.get_id_from_tab_box(tab_box) tid = self.get_id_from_tab_box(tab_box)
scroll = self.builder.get_object(f"{wid}|{tid}", use_gtk = False) scroll = self.builder.get_object(f"{wid}|{tid}", use_gtk = False)
icon_grid = scroll.get_children()[0] icon_grid = scroll.get_children()[0]
store = icon_grid.get_model()
tab = self.get_fm_window(wid).get_tab_by_id(tid) tab = self.get_fm_window(wid).get_tab_by_id(tid)
watcher = tab.get_dir_watcher() watcher = tab.get_dir_watcher()
watcher.cancel() watcher.cancel()
self.get_fm_window(wid).delete_tab_by_id(tid) 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}|icon_grid")
self.builder.dereference_object(f"{wid}|{tid}") self.builder.dereference_object(f"{wid}|{tid}")
iter = store.get_iter_first() notebook.remove_page( notebook.page_num(scroll) )
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
if not settings_manager.is_trace_debug(): if not settings_manager.is_trace_debug():
self.fm_controller.save_state() self.fm_controller.save_state()
self.set_window_title() self.set_window_title()
gc.collect()
# NOTE: Not actually getting called even tho set in the glade file... # NOTE: Not actually getting called even tho set in the glade file...
def on_tab_dnded(self, notebook, page, x, y): def on_tab_dnded(self, notebook, page, x, y):
... ...

View File

@@ -20,6 +20,8 @@ class IconGridWidget(Gtk.IconView):
def __init__(self): def __init__(self):
super(IconGridWidget, self).__init__() super(IconGridWidget, self).__init__()
self._handler_ids = []
self._setup_styling() self._setup_styling()
self._setup_signals() self._setup_signals()
self._set_up_dnd() self._set_up_dnd()
@@ -52,12 +54,12 @@ class IconGridWidget(Gtk.IconView):
grid_on_drag_data_received, grid_on_drag_data_received,
grid_on_drag_motion): grid_on_drag_motion):
self.connect("button_release_event", grid_icon_single_click) self._handler_ids.append(self.connect("button_release_event", grid_icon_single_click))
self.connect("item-activated", grid_icon_double_click) self._handler_ids.append(self.connect("item-activated", grid_icon_double_click))
self.connect("selection-changed", grid_set_selected_items) self._handler_ids.append(self.connect("selection-changed", grid_set_selected_items))
self.connect("drag-data-get", grid_on_drag_set) self._handler_ids.append(self.connect("drag-data-get", grid_on_drag_set))
self.connect("drag-data-received", grid_on_drag_data_received) self._handler_ids.append(self.connect("drag-data-received", grid_on_drag_data_received))
self.connect("drag-motion", grid_on_drag_motion) self._handler_ids.append(self.connect("drag-motion", grid_on_drag_motion))
def _load_widgets(self): def _load_widgets(self):
self.clear_and_set_new_store() self.clear_and_set_new_store()
@@ -75,20 +77,18 @@ class IconGridWidget(Gtk.IconView):
return self.get_model() return self.get_model()
def clear_and_set_new_store(self): 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) self.set_model(None)
store = Gtk.ListStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None) self.set_model(
# store = Gtk.ListStore(Gtk.DirectoryList) Gtk.ListStore(
self.set_model(store) GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None
store = 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()

View File

@@ -15,7 +15,7 @@ class TabHeaderWidget(Gtk.Box):
def __init__(self, close_tab): def __init__(self, close_tab):
super(TabHeaderWidget, self).__init__() 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_styling()
self._setup_signals() self._setup_signals()
@@ -31,18 +31,23 @@ class TabHeaderWidget(Gtk.Box):
def _load_widgets(self): def _load_widgets(self):
self.label = Gtk.Label() self.label = Gtk.Label()
close = Gtk.Button() self.close_btn = Gtk.Button()
icon = Gtk.Image(stock=Gtk.STOCK_CLOSE) icon = Gtk.Image(stock = Gtk.STOCK_CLOSE)
self.label.set_xalign(0.0) self.label.set_xalign(0.0)
self.label.set_margin_left(25) self.label.set_margin_left(25)
self.label.set_margin_right(25) self.label.set_margin_right(25)
self.label.set_hexpand(True) 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(self.label)
self.add(close) self.add(self.close_btn)
self.show_all() self.show_all()
def unload_signals(self):
self.close_btn.disconnect(self._handler_id)
self._close_tab = None
self._handler_id = None