diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py index a96c67f..ff17c69 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py @@ -22,6 +22,13 @@ def daemon_threaded_wrapper(fn): threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() return wrapper +def sizeof_fmt_def(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}" + # NOTE: Just reminding myself we can add to builtins two different ways... @@ -34,4 +41,5 @@ builtins.endpoint_registry = EndpointRegistry() builtins.threaded = threaded_wrapper builtins.daemon_threaded = daemon_threaded_wrapper +builtins.sizeof_fmt = sizeof_fmt_def builtins.event_sleep_time = 0.05 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 28ae689..192d133 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 @@ -12,12 +12,14 @@ from gi.repository import Gtk from gi.repository import GLib # Application imports -from widgets.context_menu_widget import ContextMenuWidget from widgets.rename_widget import RenameWidget +from widgets.file_exists_widget import FileExistsWidget +from widgets.context_menu_widget import ContextMenuWidget from shellfm.windows.controller import WindowController from plugins.plugins_controller import PluginsController + @dataclass(slots=True) class State: wid: int = None @@ -40,6 +42,7 @@ class Controller_Data: self.keybindings = settings.get_keybindings() RenameWidget() + FileExistsWidget() ContextMenuWidget() self.fm_controller = WindowController() diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py index 9412b92..7b0c22a 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py @@ -17,35 +17,6 @@ class ShowHideMixin: def stop_file_searching(self, widget=None, eve=None): self.is_searching = False - def show_exists_page(self, widget=None, eve=None): - response = self.file_exists_dialog.run() - self.file_exists_dialog.hide() - - if response == Gtk.ResponseType.OK: - return "rename" - if response == Gtk.ResponseType.ACCEPT: - return "rename_auto" - if response == Gtk.ResponseType.CLOSE: - return "rename_auto_all" - if response == Gtk.ResponseType.YES: - return "overwrite" - if response == Gtk.ResponseType.APPLY: - return "overwrite_all" - if response == Gtk.ResponseType.NO: - return "skip" - if response == Gtk.ResponseType.REJECT: - return "skip_all" - - def hide_exists_page_rename(self, widget=None, eve=None): - self.file_exists_dialog.response(Gtk.ResponseType.OK) - - def hide_exists_page_auto_rename(self, widget=None, eve=None): - self.file_exists_dialog.response(Gtk.ResponseType.ACCEPT) - - def hide_exists_page_auto_rename_all(self, widget=None, eve=None): - self.file_exists_dialog.response(Gtk.ResponseType.CLOSE) - - def show_about_page(self, widget=None, eve=None): about_page = self.builder.get_object("about_page") response = about_page.run() 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 170dbbd..ee5d24f 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 @@ -20,13 +20,6 @@ from widgets.io_widget import IOWidget class FileActionSignalsMixin: """docstring for FileActionSignalsMixin""" - 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}" - def get_dir_size(self, sdir): """Get the size of a directory. Based on code found online.""" size = os.path.getsize(sdir) @@ -274,8 +267,8 @@ class FileActionSignalsMixin: if _file.query_exists(): if not overwrite_all and not rename_auto_all: - self.setup_exists_data(file, _file) - response = self.show_exists_page() + event_system.emit("setup_exists_data", (file, _file)) + response = event_system.emit_and_await("show_exists_page") if response == "overwrite_all": overwrite_all = True @@ -359,47 +352,6 @@ class FileActionSignalsMixin: self.exists_file_rename_bttn.set_sensitive(False) - - 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) - - def rename_proc(self, gio_file): full_path = gio_file.get_path() base_path = gio_file.get_parent().get_path() @@ -427,16 +379,3 @@ class FileActionSignalsMixin: 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() - - 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) diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py index 32ee638..3b8b677 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py @@ -90,8 +90,8 @@ class WindowMixin(TabMixin): current_directory = tab.get_current_directory() path_file = Gio.File.new_for_path(current_directory) mount_file = path_file.query_filesystem_info(attributes="filesystem::*", cancellable=None) - formatted_mount_free = self.sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::free")) ) - formatted_mount_size = self.sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::size")) ) + formatted_mount_free = sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::free")) ) + formatted_mount_size = sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::size")) ) # NOTE: Hides empty trash and other desired buttons based on context. if self.trash_files_path == current_directory: @@ -117,7 +117,7 @@ class WindowMixin(TabMixin): print(repr(e)) - formatted_size = self.sizeof_fmt(combined_size) + formatted_size = sizeof_fmt(combined_size) if tab.is_hiding_hidden(): self.bottom_path_label.set_label(f" {len(uris)} / {tab.get_files_count()} ({formatted_size})") else: diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/event_system.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/event_system.py index 25c96fc..f8f9a7c 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/event_system.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/event_system.py @@ -28,3 +28,15 @@ class EventSystem: fn(data) else: fn() + + # NOTE: Should be used when signal has only one listener and vis-a-vis + def emit_and_await(self, event_type, data = None): + if event_type in self.subscribers: + for fn in self.subscribers[event_type]: + if data: + if hasattr(data, '__iter__') and not type(data) is str: + return fn(*data) + else: + return fn(data) + else: + return fn() 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/widgets/file_exists_widget.py new file mode 100644 index 0000000..eaacd56 --- /dev/null +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/file_exists_widget.py @@ -0,0 +1,141 @@ +# Python imports + +# Lib imports +import inspect +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from gi.repository import GLib + +# Application imports + + +class FileExistsWidget: + """docstring for FileExistsWidget.""" + + def __init__(self): + super(FileExistsWidget, self).__init__() + _GLADE_FILE = f"{settings.get_ui_widgets_path()}/file_exists_ui.glade" + builder = settings.get_builder() + self._builder = Gtk.Builder() + + self._builder.add_from_file(_GLADE_FILE) + + self.file_exists_dialog = self._builder.get_object("file_exists_dialog") + self._exists_file_label = self._builder.get_object("exists_file_label") + self._exists_file_diff_from = self._builder.get_object("exists_file_diff_from") + self._exists_file_diff_to = self._builder.get_object("exists_file_diff_to") + self._exists_file_field = self._builder.get_object("exists_file_field") + self._exists_file_from = self._builder.get_object("exists_file_from") + self._exists_file_to = self._builder.get_object("exists_file_to") + self._exists_file_rename_bttn = self._builder.get_object("exists_file_rename_bttn") + + builder.expose_object(f"file_exists_dialog", self.file_exists_dialog) + builder.expose_object(f"exists_file_diff_from", self._exists_file_diff_from) + builder.expose_object(f"exists_file_diff_to", self._exists_file_diff_to) + builder.expose_object(f"exists_file_field", self._exists_file_field) + builder.expose_object(f"exists_file_rename_bttn", self._exists_file_rename_bttn) + + self._setup_styling() + self._setup_signals() + self._load_widgets() + + + def _setup_styling(self): + ... + + def _setup_signals(self): + event_system.subscribe("setup_exists_data", self.setup_exists_data) + event_system.subscribe("show_exists_page", self.show_exists_page) + + + classes = [self] + handlers = {} + for c in classes: + methods = None + try: + methods = inspect.getmembers(c, predicate=inspect.ismethod) + handlers.update(methods) + except Exception as e: + print(repr(e)) + + self._builder.connect_signals(handlers) + + def _load_widgets(self): + ... + + def show_exists_page(self, widget=None, eve=None): + response = self.file_exists_dialog.run() + self.file_exists_dialog.hide() + + if response == Gtk.ResponseType.OK: + return "rename" + if response == Gtk.ResponseType.ACCEPT: + return "rename_auto" + if response == Gtk.ResponseType.CLOSE: + return "rename_auto_all" + if response == Gtk.ResponseType.YES: + return "overwrite" + if response == Gtk.ResponseType.APPLY: + return "overwrite_all" + if response == Gtk.ResponseType.NO: + return "skip" + if response == Gtk.ResponseType.REJECT: + return "skip_all" + + def hide_exists_page_rename(self, widget=None, eve=None): + self.file_exists_dialog.response(Gtk.ResponseType.OK) + + def hide_exists_page_auto_rename(self, widget=None, eve=None): + self.file_exists_dialog.response(Gtk.ResponseType.ACCEPT) + + def hide_exists_page_auto_rename_all(self, widget=None, eve=None): + self.file_exists_dialog.response(Gtk.ResponseType.CLOSE) + + 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) + 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() + + self._exists_file_from.set_label(from_file.get_parent().get_path()) + self._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')} {sizeof_fmt(from_size)} ( {from_size} bytes ) ( {age_text} & {size_text} )" + to_label_text = f"{to_date.format('%F %R')} {sizeof_fmt(to_size)} ( {to_size} bytes )" + + self._exists_file_diff_from.set_text(from_label_text) + self._exists_file_diff_to.set_text(to_label_text) + + + def exists_rename_field_changed(self, widget): + nfile_name = widget.get_text().strip() + ofile_name = self._exists_file_label.get_label() + + 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) diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py index 0683a31..dc34ea1 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py @@ -4,7 +4,6 @@ import inspect import gi gi.require_version('Gtk', '3.0') -from gi.repository import Gtk gi.require_version('Gdk', '3.0') from gi.repository import Gtk from gi.repository import Gdk diff --git a/user_config/usr/share/solarfm/Main_Window.glade b/user_config/usr/share/solarfm/Main_Window.glade index 42fdd5a..08eaed7 100644 --- a/user_config/usr/share/solarfm/Main_Window.glade +++ b/user_config/usr/share/solarfm/Main_Window.glade @@ -1352,339 +1352,6 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe - - 120 - False - False - True - center-always - True - dialog - True - True - True - False - False - center - main_window - - - False - 5 - 5 - 5 - 5 - vertical - 2 - - - False - end - - - Overwrite - True - True - True - - - True - True - 0 - - - - - Overwrite (All) - True - True - True - - - True - True - 1 - - - - - Skip - True - True - True - - - True - True - 2 - - - - - Skip (All) - True - True - True - - - True - True - 3 - - - - - False - False - 0 - - - - - True - False - vertical - - - True - False - Filename already exists. Please rename or select an action. - 0.10000000149011612 - - - - - - False - True - 0 - - - - - True - False - 15 - 10 - - - True - False - Moving From: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 0 - - - True - True - 2 - - - - - True - False - 20 - 10 - - - True - False - Moving To: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 3 - - - - - True - False - 0 - - - True - True - 4 - - - - - True - False - 20 - - - True - False - Filename: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 5 - - - - - True - True - - - - False - True - 6 - - - - - True - False - 20 - top - start - - - - - - Rename - True - False - True - True - - - - True - True - 1 - True - - - - - Auto Rename - True - True - True - - - - True - True - 2 - True - - - - - Auto Rename All - True - True - True - - - - True - True - 3 - True - - - - - False - True - 7 - - - - - True - True - 1 - - - - - - button5 - button6 - button7 - button8 - - - False io_button diff --git a/user_config/usr/share/solarfm/ui_widgets/file_exists_ui.glade b/user_config/usr/share/solarfm/ui_widgets/file_exists_ui.glade new file mode 100644 index 0000000..70d7291 --- /dev/null +++ b/user_config/usr/share/solarfm/ui_widgets/file_exists_ui.glade @@ -0,0 +1,337 @@ + + + + + + 120 + False + False + True + center-always + True + dialog + True + True + True + False + False + center + + + False + 5 + 5 + 5 + 5 + vertical + 2 + + + False + end + + + Overwrite + True + True + True + + + True + True + 0 + + + + + Overwrite (All) + True + True + True + + + True + True + 1 + + + + + Skip + True + True + True + + + True + True + 2 + + + + + Skip (All) + True + True + True + + + True + True + 3 + + + + + False + False + 0 + + + + + True + False + vertical + + + True + False + Filename already exists. Please rename or select an action. + 0.10000000149011612 + + + + + + False + True + 0 + + + + + True + False + 15 + 10 + + + True + False + Moving From: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 0 + + + True + True + 2 + + + + + True + False + 20 + 10 + + + True + False + Moving To: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 3 + + + + + True + False + 0 + + + True + True + 4 + + + + + True + False + 20 + + + True + False + Filename: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 5 + + + + + True + True + + + + False + True + 6 + + + + + True + False + 20 + top + start + + + + + + Rename + True + False + True + True + + + + True + True + 1 + True + + + + + Auto Rename + True + True + True + + + + True + True + 2 + True + + + + + Auto Rename All + True + True + True + + + + True + True + 3 + True + + + + + False + True + 7 + + + + + True + True + 1 + + + + + + button5 + button6 + button7 + button8 + + + +