diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py index 1ca8337..bd8db67 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py @@ -1,6 +1,5 @@ # Python imports import os -import gc import time # Lib imports @@ -13,25 +12,29 @@ from gi.repository import GLib from .controller_data import Controller_Data from .mixins.signals_mixins import SignalsMixins -from widgets.popups.message_popup_widget import MessagePopupWidget -from widgets.popups.path_menu_popup_widget import PathMenuPopupWidget -from widgets.popups.plugins_popup_widget import PluginsPopupWidget -from widgets.popups.io_popup_widget import IOPopupWidget +from .ui.dialogs.about_widget import AboutWidget +from .ui.dialogs.appchooser_widget import AppchooserWidget +from .ui.dialogs.file_exists_widget import FileExistsWidget +from .ui.dialogs.new_file_widget import NewFileWidget +from .ui.dialogs.message_widget import MessageWidget +from .ui.dialogs.rename_widget import RenameWidget +from .ui.dialogs.save_load_widget import SaveLoadWidget -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.popups.message_popup_widget import MessagePopupWidget +from .ui.popups.path_menu_popup_widget import PathMenuPopupWidget +from .ui.popups.plugins_popup_widget import PluginsPopupWidget +from .ui.popups.io_popup_widget import IOPopupWidget -from .ui import UI +from .ui.context_menu_widget import ContextMenuWidget + +from .ui_mixin import UIMixin -class Controller(UI, SignalsMixins, Controller_Data): +class Controller(UIMixin, 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() @@ -49,33 +52,39 @@ class Controller(UI, SignalsMixins, Controller_Data): message = f"FILE|{arg}" event_system.emit("post_file_to_ipc", message) + 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): - MessagePopupWidget() - PathMenuPopupWidget() - PluginsPopupWidget() - IOPopupWidget() - ContextMenuWidget() - NewFileWidget() - RenameWidget() - FileExistsWidget() - AboutWidget() - AppchooserWidget() - def _subscribe_to_events(self): event_system.subscribe("handle_file_from_ipc", self.handle_file_from_ipc) + event_system.subscribe("clear_notebooks", self.clear_notebooks) event_system.subscribe("get_current_state", self.get_current_state) event_system.subscribe("go_to_path", self.go_to_path) 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) + event_system.subscribe("generate_windows", self.generate_windows) + + # 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): + IOPopupWidget() + MessagePopupWidget() + PathMenuPopupWidget() + PluginsPopupWidget() + + AboutWidget() + AppchooserWidget() + ContextMenuWidget() + NewFileWidget() + RenameWidget() + FileExistsWidget() + SaveLoadWidget() + self.message_dialog = MessageWidget() def tear_down(self, widget=None, eve=None): @@ -87,54 +96,6 @@ class Controller(UI, SignalsMixins, Controller_Data): Gtk.main_quit() - 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) - 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() - - return - elif action == "save_session_as": - save_load_dialog.set_action(Gtk.FileChooserAction.SAVE) - elif action == "load_session": - save_load_dialog.set_action(Gtk.FileChooserAction.OPEN) - else: - raise Exception(f"Unknown action given: {action}") - - save_load_dialog.set_current_folder(tab.get_current_directory()) - save_load_dialog.set_current_name("session.json") - response = save_load_dialog.run() - if response == Gtk.ResponseType.OK: - if action == "save_session_as": - path = f"{save_load_dialog.get_current_folder()}/{save_load_dialog.get_current_name()}" - self.fm_controller.save_state(path) - elif action == "load_session": - path = f"{save_load_dialog.get_file().get_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): - ... - - save_load_dialog.hide() - - def load_session(self, session_json): - if settings.is_debug(): - logger.debug(f"Session Data: {session_json}") - - self.ctrl_down = False - self.shift_down = False - self.alt_down = False - for notebook in self.notebooks: - self.clear_children(notebook) - - self.fm_controller.unload_tabs_and_windows() - self.generate_windows(session_json) - gc.collect() - - def do_action_from_menu_controls(self, widget, eve = None): if not isinstance(widget, str): action = widget.get_name() @@ -166,7 +127,7 @@ class Controller(UI, SignalsMixins, Controller_Data): if action == "create": self.create_files() if action in ["save_session", "save_session_as", "load_session"]: - self.save_load_session(action) + event_system.emit("save_load_session", (action)) if action == "about_page": event_system.emit("show_about_page") diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py index 211ce95..4a9e259 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py @@ -20,6 +20,8 @@ from plugins.plugins_controller import PluginsController @dataclass(slots=True) class State: + fm_controller: any = None + notebooks: any = None wid: int = None tid: int = None tab: type = None @@ -28,7 +30,7 @@ class State: selected_files: [] = None to_copy_files: [] = None to_cut_files: [] = None - warning_alert: type = None + message_dialog: type = None class Controller_Data: @@ -108,11 +110,13 @@ class Controller_Data: state (obj): State ''' state = State() + state.fm_controller = self.fm_controller + state.notebooks = self.notebooks state.wid, state.tid = self.fm_controller.get_active_wid_and_tid() state.tab = self.get_fm_window(state.wid).get_tab_by_id(state.tid) state.icon_grid = self.builder.get_object(f"{state.wid}|{state.tid}|icon_grid") state.store = state.icon_grid.get_model() - state.warning_alert = self.warning_alert + state.message_dialog = self.message_dialog selected_files = state.icon_grid.get_selected_items() if selected_files: @@ -153,6 +157,15 @@ class Controller_Data: ''' Checks if a given method exists. ''' return callable(getattr(obj, name, None)) + + def clear_notebooks(self) -> None: + self.ctrl_down = False + self.shift_down = False + self.alt_down = False + + for notebook in self.notebooks: + self.clear_children(notebook) + def clear_children(self, widget: type) -> None: ''' Clear children of a gtk widget. ''' for child in widget.get_children(): diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py index 96c97f7..3001952 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py @@ -13,7 +13,7 @@ from gi.repository import Gio # Application imports -from widgets.io_widget import IOWidget +from ...ui.io_widget import IOWidget diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/grid_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/grid_mixin.py index 7b1295f..1a11d25 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/grid_mixin.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/grid_mixin.py @@ -13,9 +13,9 @@ from gi.repository import Gio from gi.repository import GdkPixbuf # Application imports -from widgets.tab_header_widget import TabHeaderWidget -from widgets.icon_grid_widget import IconGridWidget -from widgets.icon_tree_widget import IconTreeWidget +from ...ui.tab_header_widget import TabHeaderWidget +from ...ui.icon_grid_widget import IconGridWidget +from ...ui.icon_tree_widget import IconTreeWidget diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/context_menu_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/context_menu_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/context_menu_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/context_menu_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/about_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/about_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/about_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/about_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/appchooser_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/appchooser_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/appchooser_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/appchooser_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/file_exists_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/file_exists_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/file_exists_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/file_exists_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/message_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/message_widget.py new file mode 100644 index 0000000..ff2eb5a --- /dev/null +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/message_widget.py @@ -0,0 +1,33 @@ +# Python imports + +# Lib imports +import inspect +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + + +class MessageWidget(Gtk.MessageDialog): + """docstring for MessageWidget.""" + + def __init__(self): + super(MessageWidget, self).__init__() + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + + def _setup_styling(self): + ... + + def _setup_signals(self): + ... + + + def _load_widgets(self): + ... diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/new_file_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/new_file_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/new_file_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/new_file_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/rename_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/rename_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/save_load_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/save_load_widget.py new file mode 100644 index 0000000..8e86809 --- /dev/null +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/dialogs/save_load_widget.py @@ -0,0 +1,83 @@ +# Python imports +import inspect +import gc + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + + + +class SaveLoadWidget: + """docstring for SaveLoadWidget.""" + + def __init__(self): + super(SaveLoadWidget, self).__init__() + _GLADE_FILE = f"{settings.get_ui_widgets_path()}/save_load_ui.glade" + builder = settings.get_builder() + self._builder = Gtk.Builder() + + self._builder.add_from_file(_GLADE_FILE) + self.save_load_dialog = self._builder.get_object("save_load_dialog") + + builder.expose_object(f"save_load_dialog", self.save_load_dialog) + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + + def _setup_styling(self): + ... + + def _setup_signals(self): + event_system.subscribe("save_load_session", self.save_load_session) + + def _load_widgets(self): + ... + + + def save_load_session(self, action="save_session"): + state = event_system.emit_and_await("get_current_state") + + if action == "save_session": + if not settings.is_trace_debug(): + state.fm_controller.save_state() + + return + elif action == "save_session_as": + self.save_load_dialog.set_action(Gtk.FileChooserAction.SAVE) + elif action == "load_session": + self.save_load_dialog.set_action(Gtk.FileChooserAction.OPEN) + else: + raise Exception(f"Unknown action given: {action}") + + self.save_load_dialog.set_current_folder(state.tab.get_current_directory()) + self.save_load_dialog.set_current_name("session.json") + response = self.save_load_dialog.run() + if response == Gtk.ResponseType.OK: + if action == "save_session_as": + path = f"{self.save_load_dialog.get_current_folder()}/{self.save_load_dialog.get_current_name()}" + state.fm_controller.save_state(path) + elif action == "load_session": + path = f"{self.save_load_dialog.get_file().get_path()}" + session_json = state.fm_controller.get_state_from_file(path) + self.load_session(session_json) + if (response == Gtk.ResponseType.CANCEL) or (response == Gtk.ResponseType.DELETE_EVENT): + ... + + self.save_load_dialog.hide() + + def load_session(self, session_json): + if settings.is_debug(): + logger.debug(f"Session Data: {session_json}") + + state = event_system.emit_and_await("get_current_state") + event_system.emit("clear_notebooks") + state.fm_controller.unload_tabs_and_windows() + event_system.emit("generate_windows", (session_json,)) + gc.collect() diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/icon_grid_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/icon_grid_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/icon_grid_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/icon_grid_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/icon_tree_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/icon_tree_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/icon_tree_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/icon_tree_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/io_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/io_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/io_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/io_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/io_popup_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/io_popup_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/io_popup_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/io_popup_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/message_popup_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/message_popup_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/message_popup_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/message_popup_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/path_menu_popup_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/path_menu_popup_widget.py similarity index 97% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/path_menu_popup_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/path_menu_popup_widget.py index 02a051e..479d0e3 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/path_menu_popup_widget.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/path_menu_popup_widget.py @@ -22,7 +22,6 @@ class PathMenuPopupWidget(Gtk.Popover): self._setup_styling() self._setup_signals() self._load_widgets() - self.show_all() def _setup_styling(self): @@ -48,6 +47,7 @@ class PathMenuPopupWidget(Gtk.Popover): self.builder.expose_object(f"path_menu_buttons", path_menu_buttons) view_port.add(path_menu_buttons) scroll_window.add(view_port) + scroll_window.show_all() self.add(scroll_window) def show_path_menu(self, widget=None, eve=None): diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/plugins_popup_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/plugins_popup_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/popups/plugins_popup_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/popups/plugins_popup_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/tab_header_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/tab_header_widget.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/tab_header_widget.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui/tab_header_widget.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui_mixin.py similarity index 80% rename from src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui_mixin.py index 7edc0a0..77b03b7 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/ui_mixin.py @@ -9,5 +9,5 @@ from .mixins.ui.window_mixin import WindowMixin -class UI(PaneMixin, WindowMixin): +class UIMixin(PaneMixin, WindowMixin): ... diff --git a/user_config/usr/share/solarfm/Main_Window.glade b/user_config/usr/share/solarfm/Main_Window.glade index cb7cc31..8e96c7b 100644 --- a/user_config/usr/share/solarfm/Main_Window.glade +++ b/user_config/usr/share/solarfm/Main_Window.glade @@ -32,66 +32,6 @@ False gtk-stop - - False - dialog - True - - - False - vertical - 2 - - - False - end - - - gtk-cancel - True - True - True - True - True - - - True - True - 0 - - - - - gtk-ok - True - True - True - True - True - - - True - True - 1 - - - - - False - False - 0 - - - - - - - - - button11 - button12 - - True False @@ -901,79 +841,4 @@ - - False - False - True - center - True - dialog - True - True - True - False - False - center - warning - Warning! - - - False - 5 - 5 - 5 - 5 - vertical - 2 - - - False - True - end - - - gtk-no - True - True - True - True - - - True - True - 0 - - - - - gtk-yes - True - True - True - True - True - - - True - True - 1 - - - - - False - False - 0 - - - - - - button4 - button3 - - - diff --git a/user_config/usr/share/solarfm/ui_widgets/save_load_ui.glade b/user_config/usr/share/solarfm/ui_widgets/save_load_ui.glade new file mode 100644 index 0000000..ba42cba --- /dev/null +++ b/user_config/usr/share/solarfm/ui_widgets/save_load_ui.glade @@ -0,0 +1,65 @@ + + + + + + False + dialog + True + + + False + vertical + 2 + + + False + end + + + gtk-cancel + True + True + True + True + True + + + True + True + 0 + + + + + gtk-ok + True + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + + + + + button11 + button12 + + +