improved thubnailing logic, fixed new tab logic
This commit is contained in:
parent
c3f637b5fd
commit
51ac26048c
@ -101,7 +101,7 @@ class Controller(UIMixin, KeyboardSignalsMixin, IPCSignalsMixin, ExceptionHookMi
|
||||
self.fm_controller.save_state(path)
|
||||
elif action == "load_session":
|
||||
path = f"{save_load_dialog.get_file().get_path()}"
|
||||
session_json = self.fm_controller.load_state(path)
|
||||
session_json = self.fm_controller.get_state_from_file(path)
|
||||
self.load_session(session_json)
|
||||
if (response == Gtk.ResponseType.CANCEL) or (response == Gtk.ResponseType.DELETE_EVENT):
|
||||
pass
|
||||
|
@ -56,8 +56,8 @@ class Controller_Data:
|
||||
self.bottom_file_count_label = self.builder.get_object("bottom_file_count_label")
|
||||
self.bottom_path_label = self.builder.get_object("bottom_path_label")
|
||||
|
||||
self.trash_files_path = GLib.get_user_data_dir() + "/Trash/files"
|
||||
self.trash_info_path = GLib.get_user_data_dir() + "/Trash/info"
|
||||
self.trash_files_path = f"{GLib.get_user_data_dir()}/Trash/files"
|
||||
self.trash_info_path = f"{GLib.get_user_data_dir()}/Trash/info"
|
||||
|
||||
# In compress commands:
|
||||
# %n: First selected filename/dir to archive
|
||||
|
@ -15,9 +15,9 @@ from .widget_mixin import WidgetMixin
|
||||
class TabMixin(WidgetMixin):
|
||||
"""docstring for TabMixin"""
|
||||
|
||||
def create_tab(self, wid=None, path=None):
|
||||
def create_tab(self, wid=None, tid=None, path=None):
|
||||
if not wid:
|
||||
wid, _tid = self.fm_controller.get_active_wid_and_tid()
|
||||
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
||||
|
||||
notebook = self.builder.get_object(f"window_{wid}")
|
||||
path_entry = self.builder.get_object(f"path_entry")
|
||||
@ -25,7 +25,12 @@ class TabMixin(WidgetMixin):
|
||||
tab.logger = self.logger
|
||||
|
||||
tab.set_wid(wid)
|
||||
if path: tab.set_path(path)
|
||||
if not path:
|
||||
if wid and tid:
|
||||
_tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
||||
tab.set_path(_tab.get_current_directory())
|
||||
else:
|
||||
tab.set_path(path)
|
||||
|
||||
tab_widget = self.create_tab_widget(tab)
|
||||
scroll, store = self.create_icon_grid_widget(tab, wid)
|
||||
@ -123,7 +128,7 @@ class TabMixin(WidgetMixin):
|
||||
|
||||
if action == "create_tab":
|
||||
dir = tab.get_current_directory()
|
||||
self.create_tab(wid, dir)
|
||||
self.create_tab(wid, None, dir)
|
||||
self.fm_controller.save_state()
|
||||
return
|
||||
if action == "go_up":
|
||||
|
@ -27,8 +27,14 @@ class WidgetMixin:
|
||||
dir = tab.get_current_directory()
|
||||
files = tab.get_files()
|
||||
|
||||
for i, file in enumerate(files):
|
||||
# NOTE: We insure all indecies exist before calling threads that update
|
||||
# icon positions. In addition, adding the name allows us to see
|
||||
# the "file" during long or heavy number of icon updates.
|
||||
for file in files:
|
||||
store.append([None, file[0]])
|
||||
|
||||
# Now we update as fast as possible the icons.
|
||||
for i, file in enumerate(files):
|
||||
self.create_icon(i, tab, store, dir, file[0])
|
||||
|
||||
# NOTE: Not likely called often from here but it could be useful
|
||||
@ -37,27 +43,12 @@ class WidgetMixin:
|
||||
|
||||
@threaded
|
||||
def create_icon(self, i, tab, store, dir, file):
|
||||
icon = tab.create_icon(dir, file)
|
||||
icon = tab.create_icon(dir, file)
|
||||
GLib.idle_add(self.update_store, *(i, store, icon, tab, dir, file,))
|
||||
|
||||
def update_store(self, i, store, icon, tab, dir, file):
|
||||
fpath = f"{dir}/{file}"
|
||||
GLib.idle_add(self.update_store, (i, store, icon, tab, fpath,))
|
||||
|
||||
# NOTE: Might need to keep an eye on this throwing invalid iters when too
|
||||
# many updates are happening to a folder. Example: /tmp
|
||||
def update_store(self, item):
|
||||
i, store, icon, tab, fpath = item
|
||||
itr = None
|
||||
|
||||
try:
|
||||
itr = store.get_iter(i)
|
||||
except Exception as e:
|
||||
try:
|
||||
time.sleep(0.2)
|
||||
itr = store.get_iter(i)
|
||||
except Exception as e:
|
||||
print(":Invalid Itr detected: (Potential race condition...)")
|
||||
print(f"Index Requested: {i}")
|
||||
print(f"Store Size: {len(store)}")
|
||||
return
|
||||
itr = store.get_iter(i)
|
||||
|
||||
if not icon:
|
||||
icon = self.get_system_thumbnail(fpath, tab.SYS_ICON_WH[0])
|
||||
@ -69,7 +60,6 @@ class WidgetMixin:
|
||||
|
||||
store.set_value(itr, 0, icon)
|
||||
|
||||
|
||||
def get_system_thumbnail(self, filename, size):
|
||||
try:
|
||||
if os.path.exists(filename):
|
||||
@ -115,7 +105,7 @@ class WidgetMixin:
|
||||
def create_icon_grid_widget(self, tab, wid):
|
||||
scroll = Gtk.ScrolledWindow()
|
||||
grid = Gtk.IconView()
|
||||
store = Gtk.ListStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str)
|
||||
store = Gtk.ListStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None)
|
||||
|
||||
grid.set_model(store)
|
||||
grid.set_pixbuf_column(0)
|
||||
@ -157,7 +147,7 @@ class WidgetMixin:
|
||||
def create_icon_tree_widget(self, tab, wid):
|
||||
scroll = Gtk.ScrolledWindow()
|
||||
grid = Gtk.TreeView()
|
||||
store = Gtk.TreeStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str)
|
||||
store = Gtk.TreeStore(GdkPixbuf.Pixbuf or GdkPixbuf.PixbufAnimation or None, str or None)
|
||||
column = Gtk.TreeViewColumn("Icons")
|
||||
icon = Gtk.CellRendererPixbuf()
|
||||
name = Gtk.CellRendererText()
|
||||
|
@ -256,4 +256,4 @@ class WindowMixin(TabMixin):
|
||||
|
||||
|
||||
def create_new_tab_notebook(self, widget=None, wid=None, path=None):
|
||||
self.create_tab(wid, path)
|
||||
self.create_tab(wid, None, path)
|
||||
|
Loading…
Reference in New Issue
Block a user