2021-11-22 22:24:44 +00:00
|
|
|
# Python imports
|
2022-08-10 01:10:25 +00:00
|
|
|
import os, time, shlex
|
2021-11-22 22:24:44 +00:00
|
|
|
|
|
|
|
# Lib imports
|
2021-12-02 01:22:03 +00:00
|
|
|
import gi
|
|
|
|
gi.require_version('Gtk', '3.0')
|
2022-01-30 04:11:03 +00:00
|
|
|
from gi.repository import Gtk, GObject, GLib, Gio
|
2021-11-22 22:24:44 +00:00
|
|
|
|
|
|
|
# Application imports
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
|
2021-11-22 22:24:44 +00:00
|
|
|
class WidgetFileActionMixin:
|
2022-02-20 07:32:51 +00:00
|
|
|
"""docstring for WidgetFileActionMixin"""
|
|
|
|
|
2021-12-25 09:07:59 +00:00
|
|
|
def sizeof_fmt(self, num, suffix="B"):
|
|
|
|
for unit in ["", "K", "M", "G", "T", "Pi", "Ei", "Zi"]:
|
|
|
|
if abs(num) < 1024.0:
|
|
|
|
return f"{num:3.1f} {unit}{suffix}"
|
|
|
|
num /= 1024.0
|
|
|
|
return f"{num:.1f} Yi{suffix}"
|
|
|
|
|
2021-12-29 00:07:11 +00:00
|
|
|
def get_dir_size(self, sdir):
|
|
|
|
"""Get the size of a directory. Based on code found online."""
|
|
|
|
size = os.path.getsize(sdir)
|
|
|
|
|
|
|
|
for item in os.listdir(sdir):
|
|
|
|
item = os.path.join(sdir, item)
|
|
|
|
|
|
|
|
if os.path.isfile(item):
|
|
|
|
size = size + os.path.getsize(item)
|
|
|
|
elif os.path.isdir(item):
|
|
|
|
size = size + self.get_dir_size(item)
|
|
|
|
|
|
|
|
return size
|
|
|
|
|
2021-12-25 09:07:59 +00:00
|
|
|
|
2022-02-25 23:58:11 +00:00
|
|
|
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 debug:
|
2022-06-15 04:03:04 +00:00
|
|
|
self.logger.debug(f"Watcher Is Cancelled: {watcher.is_cancelled()}")
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2022-02-25 23:58:11 +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
|
|
|
|
2022-02-25 23:58:11 +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}",))
|
2022-02-25 23:58:11 +00:00
|
|
|
tab.set_dir_watcher(dir_watcher)
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2022-02-25 23:58:11 +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):
|
2021-11-30 02:42:14 +00:00
|
|
|
if eve_type in [Gio.FileMonitorEvent.CREATED, Gio.FileMonitorEvent.DELETED,
|
|
|
|
Gio.FileMonitorEvent.RENAMED, Gio.FileMonitorEvent.MOVED_IN,
|
2022-02-20 04:46:54 +00:00
|
|
|
Gio.FileMonitorEvent.MOVED_OUT]:
|
2022-07-07 04:19:41 +00:00
|
|
|
if debug:
|
|
|
|
self.logger.debug(eve_type)
|
2021-11-30 06:21:50 +00:00
|
|
|
|
2022-07-07 04:19:41 +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
|
2022-02-25 23:58:11 +00:00
|
|
|
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)
|
2022-02-25 23:58:11 +00:00
|
|
|
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
|
|
|
|
|
2022-02-25 23:58:11 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
2022-02-25 23:58:11 +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}")
|
2022-02-25 23:58:11 +00:00
|
|
|
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
|
|
|
|
2022-02-25 23:58:11 +00:00
|
|
|
tab.load_directory()
|
|
|
|
self.load_store(tab, store)
|
2022-02-17 16:13:27 +00:00
|
|
|
|
2022-02-25 23:58:11 +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]:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.set_bottom_labels(tab)
|
2021-12-01 22:26:20 +00:00
|
|
|
|
|
|
|
|
2021-12-07 07:48:52 +00:00
|
|
|
def popup_search_files(self, wid, keyname):
|
|
|
|
entry = self.builder.get_object(f"win{wid}_search_field")
|
2021-12-11 04:39:30 +00:00
|
|
|
self.builder.get_object(f"win{wid}_search").popup()
|
2021-12-07 07:48:52 +00:00
|
|
|
entry.set_text(keyname)
|
|
|
|
entry.grab_focus_without_selecting()
|
2021-12-11 04:39:30 +00:00
|
|
|
entry.set_position(-1)
|
2021-12-07 07:48:52 +00:00
|
|
|
|
|
|
|
def do_file_search(self, widget, eve=None):
|
2022-03-17 06:39:03 +00:00
|
|
|
query = widget.get_text().lower()
|
2022-02-25 23:58:11 +00:00
|
|
|
self.search_icon_grid.unselect_all()
|
|
|
|
for i, file in enumerate(self.search_tab.get_files()):
|
2022-02-15 03:12:07 +00:00
|
|
|
if query and query in file[0].lower():
|
2021-12-07 07:48:52 +00:00
|
|
|
path = Gtk.TreePath().new_from_indices([i])
|
2022-02-25 23:58:11 +00:00
|
|
|
self.search_icon_grid.select_path(path)
|
2021-12-02 01:22:03 +00:00
|
|
|
|
2022-02-25 23:58:11 +00:00
|
|
|
items = self.search_icon_grid.get_selected_items()
|
2022-03-17 06:39:03 +00:00
|
|
|
if len(items) > 0:
|
|
|
|
self.search_icon_grid.scroll_to_path(items[-1], True, 0.5, 0.5)
|
2021-12-11 03:05:38 +00:00
|
|
|
|
|
|
|
|
2021-11-26 06:53:20 +00:00
|
|
|
def open_files(self):
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
|
|
|
uris = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)
|
2021-11-26 06:53:20 +00:00
|
|
|
for file in uris:
|
2022-03-07 03:27:47 +00:00
|
|
|
state.tab.open_file_locally(file)
|
2021-11-26 06:53:20 +00:00
|
|
|
|
2021-11-27 06:51:31 +00:00
|
|
|
def open_with_files(self, appchooser_widget):
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
2021-11-27 06:51:31 +00:00
|
|
|
app_info = appchooser_widget.get_app_info()
|
2022-03-07 03:27:47 +00:00
|
|
|
uris = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files)
|
|
|
|
state.tab.app_chooser_exec(app_info, uris)
|
2021-11-26 22:50:58 +00:00
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
def execute_files(self, in_terminal=False):
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
|
|
|
paths = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)
|
|
|
|
current_dir = state.tab.get_current_directory()
|
2021-12-05 00:23:00 +00:00
|
|
|
command = None
|
|
|
|
for path in paths:
|
2022-04-03 04:23:33 +00:00
|
|
|
command = f"{shlex.quote(path)}" if not in_terminal else f"{state.tab.terminal_app} -e {shlex.quote(path)}"
|
|
|
|
state.tab.execute(shlex.split(command), start_dir=state.tab.get_current_directory())
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
def archive_files(self, archiver_dialogue):
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
2022-07-07 04:19:41 +00:00
|
|
|
paths = [shlex.quote(p) for p in self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)]
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
save_target = archiver_dialogue.get_filename();
|
|
|
|
sItr, eItr = self.arc_command_buffer.get_bounds()
|
|
|
|
pre_command = self.arc_command_buffer.get_text(sItr, eItr, False)
|
2022-04-03 04:23:33 +00:00
|
|
|
pre_command = pre_command.replace("%o", shlex.quote(save_target))
|
2021-12-06 03:18:39 +00:00
|
|
|
pre_command = pre_command.replace("%N", ' '.join(paths))
|
2022-04-03 04:23:33 +00:00
|
|
|
command = f"{state.tab.terminal_app} -e {shlex.quote(pre_command)}"
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2022-04-03 04:23:33 +00:00
|
|
|
state.tab.execute(shlex.split(command), start_dir=shlex.quote(state.tab.get_current_directory()))
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2021-11-26 22:50:58 +00:00
|
|
|
def rename_files(self):
|
|
|
|
rename_label = self.builder.get_object("file_to_rename_label")
|
|
|
|
rename_input = self.builder.get_object("new_rename_fname")
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
|
|
|
uris = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)
|
2021-11-26 22:50:58 +00:00
|
|
|
|
|
|
|
for uri in uris:
|
|
|
|
entry = uri.split("/")[-1]
|
|
|
|
rename_label.set_label(entry)
|
|
|
|
rename_input.set_text(entry)
|
|
|
|
|
2021-12-18 07:44:54 +00:00
|
|
|
self.show_edit_file_menu(rename_input)
|
2022-07-07 04:19:41 +00:00
|
|
|
|
2021-11-26 22:50:58 +00:00
|
|
|
if self.skip_edit:
|
2021-12-06 03:18:39 +00:00
|
|
|
self.skip_edit = False
|
2021-11-26 22:50:58 +00:00
|
|
|
continue
|
|
|
|
if self.cancel_edit:
|
2021-12-06 03:18:39 +00:00
|
|
|
self.cancel_edit = False
|
2021-11-26 22:50:58 +00:00
|
|
|
break
|
|
|
|
|
|
|
|
rname_to = rename_input.get_text().strip()
|
2022-03-07 03:27:47 +00:00
|
|
|
target = f"{state.tab.get_current_directory()}/{rname_to}"
|
2021-12-06 23:21:19 +00:00
|
|
|
self.handle_files([uri], "rename", target)
|
2021-11-26 22:50:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
self.skip_edit = False
|
|
|
|
self.cancel_edit = False
|
2021-12-06 03:18:39 +00:00
|
|
|
self.hide_edit_file_menu()
|
|
|
|
self.selected_files.clear()
|
2021-11-26 22:50:58 +00:00
|
|
|
|
|
|
|
def cut_files(self):
|
2022-03-08 01:18:55 +00:00
|
|
|
self.to_copy_files.clear()
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
|
|
|
uris = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)
|
2021-11-26 22:50:58 +00:00
|
|
|
self.to_cut_files = uris
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2021-11-26 22:50:58 +00:00
|
|
|
def copy_files(self):
|
2022-03-08 01:18:55 +00:00
|
|
|
self.to_cut_files.clear()
|
2022-03-07 03:27:47 +00:00
|
|
|
state = self.get_current_state()
|
|
|
|
uris = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)
|
2021-11-26 22:50:58 +00:00
|
|
|
self.to_copy_files = uris
|
2021-11-22 22:24:44 +00:00
|
|
|
|
|
|
|
def paste_files(self):
|
2022-02-25 23:58:11 +00:00
|
|
|
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
|
|
|
tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
|
|
|
target = f"{tab.get_current_directory()}"
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2022-02-26 08:49:08 +00:00
|
|
|
if self.to_copy_files:
|
2021-12-06 23:21:19 +00:00
|
|
|
self.handle_files(self.to_copy_files, "copy", target)
|
2022-02-26 08:49:08 +00:00
|
|
|
elif self.to_cut_files:
|
2021-12-06 23:21:19 +00:00
|
|
|
self.handle_files(self.to_cut_files, "move", target)
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2021-12-06 23:21:19 +00:00
|
|
|
def create_files(self):
|
2022-09-03 01:15:20 +00:00
|
|
|
fname_field = self.builder.get_object("new_fname_field")
|
|
|
|
self.show_new_file_menu(fname_field)
|
|
|
|
|
|
|
|
if self.cancel_creation:
|
|
|
|
self.cancel_creation = False
|
|
|
|
return
|
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
file_name = fname_field.get_text().strip()
|
|
|
|
type = self.builder.get_object("context_menu_type_toggle").get_state()
|
|
|
|
|
2022-02-25 23:58:11 +00:00
|
|
|
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
|
|
|
tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
|
|
|
target = f"{tab.get_current_directory()}"
|
2021-12-05 00:23:00 +00:00
|
|
|
|
|
|
|
if file_name:
|
2022-01-24 16:24:55 +00:00
|
|
|
path = f"{target}/{file_name}"
|
2021-12-06 03:18:39 +00:00
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
if type == True: # Create File
|
2021-12-06 23:21:19 +00:00
|
|
|
self.handle_files([path], "create_file")
|
2021-12-05 00:23:00 +00:00
|
|
|
else: # Create Folder
|
2021-12-06 23:21:19 +00:00
|
|
|
self.handle_files([path], "create_dir")
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2022-09-03 01:15:20 +00:00
|
|
|
self.cancel_creation = False
|
2022-01-30 01:32:56 +00:00
|
|
|
self.hide_new_file_menu()
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2022-09-03 01:15:20 +00:00
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
def move_files(self, files, target):
|
2021-12-06 23:21:19 +00:00
|
|
|
self.handle_files(files, "move", target)
|
2021-12-05 00:23:00 +00:00
|
|
|
|
2022-09-03 01:15:20 +00:00
|
|
|
|
2022-01-30 04:11:03 +00:00
|
|
|
# NOTE: Gtk recommends using fail flow than pre check which is more
|
2021-12-06 03:18:39 +00:00
|
|
|
# race condition proof. They're right; but, they can't even delete
|
|
|
|
# directories properly. So... f**k them. I'll do it my way.
|
2021-12-06 23:21:19 +00:00
|
|
|
def handle_files(self, paths, action, _target_path=None):
|
2021-12-06 03:18:39 +00:00
|
|
|
target = None
|
|
|
|
_file = None
|
|
|
|
response = None
|
|
|
|
overwrite_all = False
|
|
|
|
rename_auto_all = False
|
2021-11-22 22:24:44 +00:00
|
|
|
|
|
|
|
for path in paths:
|
|
|
|
try:
|
2021-12-27 23:27:57 +00:00
|
|
|
if "file://" in path:
|
|
|
|
path = path.split("file://")[1]
|
2021-11-29 22:49:56 +00:00
|
|
|
|
2021-12-27 23:27:57 +00:00
|
|
|
file = Gio.File.new_for_path(path)
|
2021-11-26 22:50:58 +00:00
|
|
|
if _target_path:
|
2022-03-17 06:39:03 +00:00
|
|
|
if file.get_parent().get_path() == _target_path:
|
|
|
|
raise Exception("Parent dir of target and file locations are the same! Won't copy or move!")
|
|
|
|
|
2021-12-27 00:55:10 +00:00
|
|
|
if os.path.isdir(_target_path):
|
2021-11-29 22:49:56 +00:00
|
|
|
info = file.query_info("standard::display-name", 0, cancellable=None)
|
|
|
|
_target = f"{_target_path}/{info.get_display_name()}"
|
2021-12-27 00:55:10 +00:00
|
|
|
_file = Gio.File.new_for_path(_target)
|
2021-11-26 22:50:58 +00:00
|
|
|
else:
|
2021-12-27 00:55:10 +00:00
|
|
|
_file = Gio.File.new_for_path(_target_path)
|
2021-12-06 03:18:39 +00:00
|
|
|
else:
|
2021-12-27 00:55:10 +00:00
|
|
|
_file = Gio.File.new_for_path(path)
|
2021-12-06 03:18:39 +00:00
|
|
|
|
2021-11-29 22:49:56 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if _file.query_exists():
|
|
|
|
if not overwrite_all and not rename_auto_all:
|
2022-01-30 04:11:03 +00:00
|
|
|
self.setup_exists_data(file, _file)
|
2021-12-06 03:18:39 +00:00
|
|
|
response = self.show_exists_page()
|
2021-11-29 22:49:56 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if response == "overwrite_all":
|
|
|
|
overwrite_all = True
|
|
|
|
if response == "rename_auto_all":
|
|
|
|
rename_auto_all = True
|
2021-11-29 22:49:56 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if response == "rename":
|
|
|
|
base_path = _file.get_parent().get_path()
|
|
|
|
new_name = self.exists_file_field.get_text().strip()
|
|
|
|
rfPath = f"{base_path}/{new_name}"
|
|
|
|
_file = Gio.File.new_for_path(rfPath)
|
2021-12-02 01:22:03 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if response == "rename_auto" or rename_auto_all:
|
|
|
|
_file = self.rename_proc(_file)
|
2021-12-02 01:22:03 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if response == "overwrite" or overwrite_all:
|
2021-12-06 23:21:19 +00:00
|
|
|
type = _file.query_file_type(flags=Gio.FileQueryInfoFlags.NONE)
|
2021-12-02 01:22:03 +00:00
|
|
|
|
|
|
|
if type == Gio.FileType.DIRECTORY:
|
2022-02-25 23:58:11 +00:00
|
|
|
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
|
|
|
tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
|
|
|
tab.delete_file( _file.get_path() )
|
2021-12-02 01:22:03 +00:00
|
|
|
else:
|
2021-12-06 03:18:39 +00:00
|
|
|
_file.delete(cancellable=None)
|
|
|
|
|
|
|
|
if response == "skip":
|
|
|
|
continue
|
|
|
|
if response == "skip_all":
|
2021-12-02 01:22:03 +00:00
|
|
|
break
|
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if _target_path:
|
|
|
|
target = _file
|
|
|
|
else:
|
|
|
|
file = _file
|
|
|
|
|
|
|
|
|
|
|
|
if action == "create_file":
|
|
|
|
file.create(flags=Gio.FileCreateFlags.NONE, cancellable=None)
|
|
|
|
continue
|
|
|
|
if action == "create_dir":
|
|
|
|
file.make_directory(cancellable=None)
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
type = file.query_file_type(flags=Gio.FileQueryInfoFlags.NONE)
|
|
|
|
if type == Gio.FileType.DIRECTORY:
|
2022-02-25 23:58:11 +00:00
|
|
|
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
|
|
|
tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
2021-12-06 03:18:39 +00:00
|
|
|
fPath = file.get_path()
|
2021-12-07 03:59:52 +00:00
|
|
|
tPath = target.get_path()
|
2021-12-06 03:18:39 +00:00
|
|
|
state = True
|
|
|
|
|
|
|
|
if action == "copy":
|
2022-02-25 23:58:11 +00:00
|
|
|
tab.copy_file(fPath, tPath)
|
2021-12-06 03:18:39 +00:00
|
|
|
if action == "move" or action == "rename":
|
2022-02-25 23:58:11 +00:00
|
|
|
tab.move_file(fPath, tPath)
|
2021-12-06 03:18:39 +00:00
|
|
|
else:
|
|
|
|
if action == "copy":
|
|
|
|
file.copy(target, flags=Gio.FileCopyFlags.BACKUP, cancellable=None)
|
|
|
|
if action == "move" or action == "rename":
|
|
|
|
file.move(target, flags=Gio.FileCopyFlags.BACKUP, cancellable=None)
|
2021-12-02 01:22:03 +00:00
|
|
|
|
2021-11-22 22:24:44 +00:00
|
|
|
except GObject.GError as e:
|
2021-11-28 06:40:47 +00:00
|
|
|
raise OSError(e)
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
self.exists_file_rename_bttn.set_sensitive(False)
|
|
|
|
|
|
|
|
|
2022-01-30 04:11:03 +00:00
|
|
|
def setup_exists_data(self, from_file, to_file):
|
|
|
|
from_info = from_file.query_info("standard::*,time::modified", 0, cancellable=None)
|
|
|
|
to_info = to_file.query_info("standard::*,time::modified", 0, cancellable=None)
|
|
|
|
exists_file_diff_from = self.builder.get_object("exists_file_diff_from")
|
|
|
|
exists_file_diff_to = self.builder.get_object("exists_file_diff_to")
|
|
|
|
exists_file_from = self.builder.get_object("exists_file_from")
|
|
|
|
exists_file_to = self.builder.get_object("exists_file_to")
|
|
|
|
from_date = from_info.get_modification_date_time()
|
|
|
|
to_date = to_info.get_modification_date_time()
|
|
|
|
from_size = from_info.get_size()
|
|
|
|
to_size = to_info.get_size()
|
|
|
|
|
|
|
|
exists_file_from.set_label(from_file.get_parent().get_path())
|
|
|
|
exists_file_to.set_label(to_file.get_parent().get_path())
|
|
|
|
self.exists_file_label.set_label(to_file.get_basename())
|
|
|
|
self.exists_file_field.set_text(to_file.get_basename())
|
|
|
|
|
|
|
|
# Returns: -1, 0 or 1 if dt1 is less than, equal to or greater than dt2.
|
|
|
|
age = GLib.DateTime.compare(from_date, to_date)
|
|
|
|
age_text = "( same time )"
|
|
|
|
if age == -1:
|
|
|
|
age_text = "older"
|
|
|
|
if age == 1:
|
|
|
|
age_text = "newer"
|
|
|
|
|
|
|
|
size_text = "( same size )"
|
|
|
|
if from_size < to_size:
|
|
|
|
size_text = "smaller"
|
|
|
|
if from_size > to_size:
|
|
|
|
size_text = "larger"
|
|
|
|
|
|
|
|
from_label_text = f"{age_text} & {size_text}"
|
|
|
|
if age_text != "( same time )" or size_text != "( same size )":
|
|
|
|
from_label_text = f"{from_date.format('%F %R')} {self.sizeof_fmt(from_size)} ( {from_size} bytes ) ( {age_text} & {size_text} )"
|
|
|
|
to_label_text = f"{to_date.format('%F %R')} {self.sizeof_fmt(to_size)} ( {to_size} bytes )"
|
|
|
|
|
|
|
|
exists_file_diff_from.set_text(from_label_text)
|
|
|
|
exists_file_diff_to.set_text(to_label_text)
|
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
|
|
|
|
def rename_proc(self, gio_file):
|
|
|
|
full_path = gio_file.get_path()
|
|
|
|
base_path = gio_file.get_parent().get_path()
|
|
|
|
file_name = os.path.splitext(gio_file.get_basename())[0]
|
|
|
|
extension = os.path.splitext(full_path)[-1]
|
|
|
|
target = Gio.File.new_for_path(full_path)
|
2021-12-28 03:53:43 +00:00
|
|
|
start = "-copy"
|
2021-12-06 03:18:39 +00:00
|
|
|
|
|
|
|
if debug:
|
2022-06-15 04:03:04 +00:00
|
|
|
self.logger.debug(f"Path: {full_path}")
|
|
|
|
self.logger.debug(f"Base Path: {base_path}")
|
|
|
|
self.logger.debug(f'Name: {file_name}')
|
|
|
|
self.logger.debug(f"Extension: {extension}")
|
2021-12-06 03:18:39 +00:00
|
|
|
|
|
|
|
i = 2
|
|
|
|
while target.query_exists():
|
2021-12-28 03:53:43 +00:00
|
|
|
try:
|
|
|
|
value = file_name[(file_name.find(start)+len(start)):]
|
|
|
|
int(value)
|
|
|
|
file_name = file_name.split(start)[0]
|
|
|
|
except Exception as e:
|
|
|
|
pass
|
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
target = Gio.File.new_for_path(f"{base_path}/{file_name}-copy{i}{extension}")
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
return target
|
|
|
|
|
|
|
|
|
|
|
|
def exists_rename_field_changed(self, widget):
|
|
|
|
nfile_name = widget.get_text().strip()
|
|
|
|
ofile_name = self.exists_file_label.get_label()
|
2021-11-29 22:49:56 +00:00
|
|
|
|
2021-12-06 03:18:39 +00:00
|
|
|
if nfile_name:
|
|
|
|
if nfile_name == ofile_name:
|
|
|
|
self.exists_file_rename_bttn.set_sensitive(False)
|
|
|
|
else:
|
|
|
|
self.exists_file_rename_bttn.set_sensitive(True)
|
|
|
|
else:
|
|
|
|
self.exists_file_rename_bttn.set_sensitive(False)
|