SolarFM/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py

206 lines
7.2 KiB
Python
Raw Normal View History

2021-10-10 06:45:55 +00:00
# Python imports
import os
import gc
import time
2021-10-10 06:45:55 +00:00
# Lib imports
2021-10-14 02:30:08 +00:00
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
2021-10-10 06:45:55 +00:00
# Application imports
from .controller_data import Controller_Data
from .mixins.signals_mixins import SignalsMixins
from widgets.popups.plugins_popup_widget import PluginsPopupWidget
from widgets.popups.io_popup_widget import IOPopupWidget
from widgets.context_menu_widget import ContextMenuWidget
from widgets.new_file_widget import NewFileWidget
from widgets.rename_widget import RenameWidget
from widgets.file_exists_widget import FileExistsWidget
from widgets.about_widget import AboutWidget
from widgets.appchooser_widget import AppchooserWidget
from .ui import UI
2021-10-10 06:45:55 +00:00
class Controller(UI, SignalsMixins, Controller_Data):
""" Controller coordinates the mixins and is somewhat the root hub of it all. """
def __init__(self, args, unknownargs):
self._setup_styling()
self._setup_signals()
2022-10-23 04:53:33 +00:00
self._subscribe_to_events()
self._load_widgets()
self.setup_controller_data()
2022-03-08 01:18:55 +00:00
self.generate_windows(self.fm_controller_data)
2022-10-27 00:47:54 +00:00
if args.no_plugins == "false":
self.plugins.launch_plugins()
2021-10-10 06:45:55 +00:00
2022-10-23 04:53:33 +00:00
for arg in unknownargs + [args.new_tab,]:
if os.path.isdir(arg):
message = f"FILE|{arg}"
event_system.emit("post_file_to_ipc", message)
2022-09-29 22:22:33 +00:00
def _setup_styling(self):
...
def _setup_signals(self):
...
# NOTE: Really we will move these to the UI/(New) Window 'base' controller
# after we're done cleaning and refactoring to use fewer mixins.
def _load_widgets(self):
PluginsPopupWidget()
IOPopupWidget()
ContextMenuWidget()
NewFileWidget()
RenameWidget()
FileExistsWidget()
AboutWidget()
AppchooserWidget()
2021-11-25 08:21:10 +00:00
2022-09-29 22:22:33 +00:00
def _subscribe_to_events(self):
event_system.subscribe("handle_file_from_ipc", self.handle_file_from_ipc)
event_system.subscribe("get_current_state", self.get_current_state)
event_system.subscribe("display_message", self.display_message)
2022-10-01 21:04:46 +00:00
event_system.subscribe("go_to_path", self.go_to_path)
2022-10-27 00:47:54 +00:00
event_system.subscribe("do_action_from_menu_controls", self.do_action_from_menu_controls)
# NOTE: Needs to be moved (probably just to file actions class) after reducing mixins usage
event_system.subscribe("open_with_files", self.open_with_files)
2021-11-25 08:21:10 +00:00
2021-11-22 03:52:46 +00:00
def tear_down(self, widget=None, eve=None):
if not settings.is_trace_debug():
self.fm_controller.save_state()
settings.clear_pid()
2021-11-22 03:52:46 +00:00
time.sleep(event_sleep_time)
Gtk.main_quit()
2022-02-02 05:29:42 +00:00
def save_load_session(self, action="save_session"):
wid, tid = self.fm_controller.get_active_wid_and_tid()
tab = self.get_fm_window(wid).get_tab_by_id(tid)
2022-02-02 05:29:42 +00:00
save_load_dialog = self.builder.get_object("save_load_dialog")
if action == "save_session":
if not settings.is_trace_debug():
self.fm_controller.save_state()
2022-02-05 00:14:11 +00:00
return
elif action == "save_session_as":
2022-02-02 05:29:42 +00:00
save_load_dialog.set_action(Gtk.FileChooserAction.SAVE)
elif action == "load_session":
save_load_dialog.set_action(Gtk.FileChooserAction.OPEN)
2022-02-05 00:14:11 +00:00
else:
raise Exception(f"Unknown action given: {action}")
2022-02-02 05:29:42 +00:00
save_load_dialog.set_current_folder(tab.get_current_directory())
2022-02-04 23:46:03 +00:00
save_load_dialog.set_current_name("session.json")
2022-02-02 05:29:42 +00:00
response = save_load_dialog.run()
if response == Gtk.ResponseType.OK:
2022-03-03 01:30:35 +00:00
if action == "save_session_as":
2022-02-04 23:46:03 +00:00
path = f"{save_load_dialog.get_current_folder()}/{save_load_dialog.get_current_name()}"
self.fm_controller.save_state(path)
2022-02-02 05:29:42 +00:00
elif action == "load_session":
2022-02-04 23:46:03 +00:00
path = f"{save_load_dialog.get_file().get_path()}"
session_json = self.fm_controller.get_state_from_file(path)
2022-02-04 23:46:03 +00:00
self.load_session(session_json)
2022-02-02 05:29:42 +00:00
if (response == Gtk.ResponseType.CANCEL) or (response == Gtk.ResponseType.DELETE_EVENT):
2022-10-23 04:53:33 +00:00
...
2022-02-02 05:29:42 +00:00
save_load_dialog.hide()
2022-02-04 23:46:03 +00:00
def load_session(self, session_json):
if settings.is_debug():
logger.debug(f"Session Data: {session_json}")
2022-02-04 23:46:03 +00:00
self.ctrl_down = False
self.shift_down = False
self.alt_down = False
2022-02-04 23:46:03 +00:00
for notebook in self.notebooks:
self.clear_children(notebook)
self.fm_controller.unload_tabs_and_windows()
2022-02-04 23:46:03 +00:00
self.generate_windows(session_json)
gc.collect()
2022-10-01 21:04:46 +00:00
def do_action_from_menu_controls(self, widget, eve = None):
2022-10-27 00:47:54 +00:00
if not isinstance(widget, str):
action = widget.get_name()
else:
action = widget
event_system.emit("hide_context_menu")
event_system.emit("hide_new_file_menu")
event_system.emit("hide_rename_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":
event_system.emit("show_appchooser_menu")
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.cut_files()
if action == "copy":
self.copy_files()
if action == "copy_name":
self.copy_name()
2021-11-22 22:24:44 +00:00
if action == "paste":
self.paste_files()
2021-12-05 00:23:00 +00:00
if action == "create":
2022-09-03 01:15:20 +00:00
self.create_files()
2022-02-05 00:14:11 +00:00
if action in ["save_session", "save_session_as", "load_session"]:
2022-02-02 05:29:42 +00:00
self.save_load_session(action)
if action == "about_page":
event_system.emit("show_about_page")
if action == "io_popup":
event_system.emit("show_io_popup")
if action == "plugins_popup":
event_system.emit("show_plugins_popup")
2022-03-07 03:27:47 +00:00
@endpoint_registry.register(rule="go_home")
2022-03-07 03:27:47 +00:00
def go_home(self, widget=None, eve=None):
self.builder.get_object("go_home").released()
@endpoint_registry.register(rule="refresh_tab")
2022-03-07 03:27:47 +00:00
def refresh_tab(self, widget=None, eve=None):
self.builder.get_object("refresh_tab").released()
@endpoint_registry.register(rule="go_up")
2022-03-07 03:27:47 +00:00
def go_up(self, widget=None, eve=None):
self.builder.get_object("go_up").released()
@endpoint_registry.register(rule="grab_focus_path_entry")
2022-03-07 03:27:47 +00:00
def grab_focus_path_entry(self, widget=None, eve=None):
self.builder.get_object("path_entry").grab_focus()
@endpoint_registry.register(rule="tggl_top_main_menubar")
2022-03-07 03:27:47 +00:00
def tggl_top_main_menubar(self, widget=None, eve=None):
top_main_menubar = self.builder.get_object("top_main_menubar")
top_main_menubar.hide() if top_main_menubar.is_visible() else top_main_menubar.show()
@endpoint_registry.register(rule="open_terminal")
2022-03-07 03:27:47 +00:00
def open_terminal(self, widget=None, eve=None):
wid, tid = self.fm_controller.get_active_wid_and_tid()
tab = self.get_fm_window(wid).get_tab_by_id(tid)
tab.execute([f"{tab.terminal_app}"], start_dir=tab.get_current_directory())
2022-10-01 21:04:46 +00:00
def go_to_path(self, path):
self.path_entry.set_text(path)