2021-10-10 06:45:55 +00:00
|
|
|
# Python imports
|
2021-12-29 00:07:11 +00:00
|
|
|
import sys, traceback, threading, signal, inspect, os, time
|
2021-10-10 06:45:55 +00:00
|
|
|
|
2021-12-07 04:44:39 +00:00
|
|
|
# Lib imports
|
2021-10-14 02:30:08 +00:00
|
|
|
import gi
|
|
|
|
gi.require_version('Gtk', '3.0')
|
2021-12-07 04:44:39 +00:00
|
|
|
from gi.repository import Gtk, GLib
|
2021-10-10 06:45:55 +00:00
|
|
|
|
|
|
|
# Application imports
|
|
|
|
from .mixins import *
|
2021-11-28 02:01:20 +00:00
|
|
|
from . import ShowHideMixin, KeyboardSignalsMixin, Controller_Data
|
2021-10-10 06:45:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
def threaded(fn):
|
|
|
|
def wrapper(*args, **kwargs):
|
2021-12-25 05:58:57 +00:00
|
|
|
threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start()
|
2021-10-10 06:45:55 +00:00
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
2021-12-07 04:44:39 +00:00
|
|
|
|
|
|
|
|
2021-12-06 23:21:19 +00:00
|
|
|
class Controller(WidgetFileActionMixin, PaneMixin, WindowMixin, ShowHideMixin, \
|
|
|
|
KeyboardSignalsMixin, Controller_Data):
|
2021-11-28 02:01:20 +00:00
|
|
|
def __init__(self, args, unknownargs, _settings):
|
2021-12-05 00:23:00 +00:00
|
|
|
# sys.excepthook = self.custom_except_hook
|
2021-11-28 06:40:47 +00:00
|
|
|
self.settings = _settings
|
2021-11-28 02:01:20 +00:00
|
|
|
self.setup_controller_data()
|
2021-11-21 03:00:34 +00:00
|
|
|
|
2021-10-10 06:45:55 +00:00
|
|
|
self.window.show()
|
|
|
|
self.generate_windows(self.state)
|
|
|
|
|
2021-10-14 02:30:08 +00:00
|
|
|
self.window.connect("delete-event", self.tear_down)
|
2021-11-16 07:28:08 +00:00
|
|
|
GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, self.tear_down)
|
2021-10-14 02:30:08 +00:00
|
|
|
self.gui_event_observer()
|
|
|
|
|
2021-11-25 08:21:10 +00:00
|
|
|
if unknownargs:
|
|
|
|
for arg in unknownargs:
|
|
|
|
if os.path.isdir(arg):
|
|
|
|
message = f"FILE|{arg}"
|
|
|
|
event_system.send_ipc_message(message)
|
|
|
|
|
|
|
|
if args.new_tab and os.path.isdir(args.new_tab):
|
|
|
|
message = f"FILE|{args.new_tab}"
|
|
|
|
event_system.send_ipc_message(message)
|
|
|
|
|
|
|
|
|
2021-11-22 03:52:46 +00:00
|
|
|
def tear_down(self, widget=None, eve=None):
|
2021-11-25 08:21:10 +00:00
|
|
|
event_system.send_ipc_message("close server")
|
2021-11-26 22:50:58 +00:00
|
|
|
self.window_controller.save_state()
|
2021-11-22 03:52:46 +00:00
|
|
|
time.sleep(event_sleep_time)
|
|
|
|
Gtk.main_quit()
|
|
|
|
|
2021-12-02 01:22:03 +00:00
|
|
|
|
2021-10-14 02:30:08 +00:00
|
|
|
@threaded
|
|
|
|
def gui_event_observer(self):
|
2021-12-25 05:58:57 +00:00
|
|
|
while True:
|
2021-10-14 02:30:08 +00:00
|
|
|
time.sleep(event_sleep_time)
|
|
|
|
event = event_system.consume_gui_event()
|
|
|
|
if event:
|
2021-11-16 07:28:08 +00:00
|
|
|
try:
|
|
|
|
type, target, data = event
|
|
|
|
method = getattr(self.__class__, type)
|
|
|
|
GLib.idle_add(method, (self, data,))
|
|
|
|
except Exception as e:
|
|
|
|
print(repr(e))
|
|
|
|
|
2021-11-27 21:53:05 +00:00
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
def custom_except_hook(self, exctype, value, _traceback):
|
2021-11-28 06:40:47 +00:00
|
|
|
trace = ''.join(traceback.format_tb(_traceback))
|
|
|
|
data = f"Exectype: {exctype} <--> Value: {value}\n\n{trace}\n\n\n\n"
|
|
|
|
start_itr = self.message_buffer.get_start_iter()
|
|
|
|
self.message_buffer.place_cursor(start_itr)
|
|
|
|
self.display_message(self.error, data)
|
|
|
|
|
|
|
|
def display_message(self, type, text, seconds=None):
|
|
|
|
self.message_buffer.insert_at_cursor(text)
|
2021-11-28 02:01:20 +00:00
|
|
|
self.message_widget.popup()
|
2021-11-28 06:40:47 +00:00
|
|
|
if seconds:
|
|
|
|
self.hide_message_timeout(seconds)
|
2021-11-28 02:01:20 +00:00
|
|
|
|
|
|
|
@threaded
|
|
|
|
def hide_message_timeout(self, seconds=3):
|
|
|
|
time.sleep(seconds)
|
|
|
|
GLib.idle_add(self.message_widget.popdown)
|
|
|
|
|
2021-11-29 02:27:49 +00:00
|
|
|
def save_debug_alerts(self, widget=None, eve=None):
|
|
|
|
start_itr, end_itr = self.message_buffer.get_bounds()
|
|
|
|
save_location_prompt = Gtk.FileChooserDialog("Choose Save Folder", self.window, \
|
|
|
|
action = Gtk.FileChooserAction.SAVE, \
|
|
|
|
buttons = (Gtk.STOCK_CANCEL, \
|
|
|
|
Gtk.ResponseType.CANCEL, \
|
|
|
|
Gtk.STOCK_SAVE, \
|
|
|
|
Gtk.ResponseType.OK))
|
|
|
|
|
|
|
|
text = self.message_buffer.get_text(start_itr, end_itr, False)
|
|
|
|
resp = save_location_prompt.run()
|
|
|
|
if (resp == Gtk.ResponseType.CANCEL) or (resp == Gtk.ResponseType.DELETE_EVENT):
|
|
|
|
pass
|
|
|
|
elif resp == Gtk.ResponseType.OK:
|
|
|
|
target = save_location_prompt.get_filename();
|
|
|
|
with open(target, "w") as f:
|
|
|
|
f.write(text)
|
|
|
|
|
|
|
|
save_location_prompt.destroy()
|
|
|
|
|
|
|
|
|
2021-11-29 08:01:51 +00:00
|
|
|
def set_arc_buffer_text(self, widget=None, eve=None):
|
|
|
|
id = widget.get_active_id()
|
|
|
|
self.arc_command_buffer.set_text(self.arc_commands[int(id)])
|
|
|
|
|
2021-12-02 01:22:03 +00:00
|
|
|
|
2021-12-12 06:03:51 +00:00
|
|
|
def clear_children(self, widget):
|
|
|
|
for child in widget.get_children():
|
|
|
|
widget.remove(child)
|
|
|
|
|
2021-12-06 23:21:19 +00:00
|
|
|
def get_current_state(self):
|
|
|
|
wid, tid = self.window_controller.get_active_data()
|
|
|
|
view = self.get_fm_window(wid).get_view_by_id(tid)
|
|
|
|
iconview = self.builder.get_object(f"{wid}|{tid}|iconview")
|
|
|
|
store = iconview.get_model()
|
|
|
|
return wid, tid, view, iconview, store
|
2021-11-29 08:01:51 +00:00
|
|
|
|
2021-12-01 22:26:20 +00:00
|
|
|
def do_action_from_menu_controls(self, widget, eventbutton):
|
|
|
|
action = widget.get_name()
|
2021-11-22 22:24:44 +00:00
|
|
|
self.ctrlDown = True
|
|
|
|
self.hide_context_menu()
|
2021-11-26 22:50:58 +00:00
|
|
|
self.hide_new_file_menu()
|
|
|
|
self.hide_edit_file_menu()
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
if action == "open":
|
|
|
|
self.open_files()
|
|
|
|
if action == "open_with":
|
|
|
|
self.show_appchooser_menu()
|
2021-12-01 22:26:20 +00:00
|
|
|
if action == "execute":
|
|
|
|
self.execute_files()
|
|
|
|
if action == "execute_in_terminal":
|
|
|
|
self.execute_files(in_terminal=True)
|
2021-11-26 22:50:58 +00:00
|
|
|
if action == "rename":
|
|
|
|
self.rename_files()
|
2021-11-22 22:24:44 +00:00
|
|
|
if action == "cut":
|
|
|
|
self.to_copy_files.clear()
|
|
|
|
self.cut_files()
|
|
|
|
if action == "copy":
|
|
|
|
self.to_cut_files.clear()
|
|
|
|
self.copy_files()
|
|
|
|
if action == "paste":
|
|
|
|
self.paste_files()
|
2021-11-29 08:01:51 +00:00
|
|
|
if action == "archive":
|
|
|
|
self.show_archiver_dialogue()
|
2021-11-22 22:24:44 +00:00
|
|
|
if action == "delete":
|
2021-12-02 01:22:03 +00:00
|
|
|
self.delete_files()
|
|
|
|
if action == "trash":
|
2021-11-22 22:24:44 +00:00
|
|
|
self.trash_files()
|
2021-11-29 08:01:51 +00:00
|
|
|
if action == "go_to_trash":
|
|
|
|
self.builder.get_object("path_entry").set_text(self.trash_files_path)
|
2021-12-29 00:07:11 +00:00
|
|
|
if action == "restore_from_trash":
|
|
|
|
self.restore_trash_files()
|
|
|
|
if action == "empty_trash":
|
|
|
|
self.empty_trash()
|
2021-11-22 22:24:44 +00:00
|
|
|
|
2021-12-05 00:23:00 +00:00
|
|
|
|
|
|
|
if action == "create":
|
2021-12-06 23:21:19 +00:00
|
|
|
self.create_files()
|
2021-12-05 00:23:00 +00:00
|
|
|
self.hide_new_file_menu()
|
|
|
|
|
2021-11-22 22:24:44 +00:00
|
|
|
self.ctrlDown = False
|