From a418df2ce7e32b19568c04cd521f989315f2ea06 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Mon, 29 Nov 2021 02:01:51 -0600 Subject: [PATCH] Added archive dialoug; go to trash context option --- README.md | 2 +- .../new/solarfm/signal_classes/Controller.py | 26 ++- .../solarfm/signal_classes/Controller_Data.py | 58 ++++-- .../solarfm/signal_classes/ShowHideMixin.py | 25 ++- .../mixins/WidgetFileActionMixin.py | 14 ++ user_config/solarfm/Main_Window.glade | 194 +++++++++++++++++- 6 files changed, 288 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 3e39741..687f47f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ SolarFM is a Gtk+ Python file manager.
  • Add prompt guards for actions.
  • Add path bar search dropdown.
  • Add "execute" and "execute in terminal" context options.
  • -
  • Add "go to trash", "clear trash", "restore from trash" options.
  • +
  • Add "clear trash", "restore from trash" options.
  • Add drive size free and consumed info to bottom bar.
  • Add simpleish plugin system to run bash/python scripts.
  • Add DnD context awareness for over folder drop.
  • diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller.py b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller.py index d01b32a..179c65c 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller.py +++ b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller.py @@ -18,8 +18,8 @@ def threaded(fn): return wrapper -class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFileActionMixin, \ - PaneMixin, WindowMixin): +class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, \ + WidgetFileActionMixin, PaneMixin, WindowMixin): def __init__(self, args, unknownargs, _settings): sys.excepthook = self.my_except_hook self.settings = _settings @@ -109,10 +109,18 @@ class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFil self.to_rename_files = self.selected_files self.rename_files() - def execute(self, option, start_dir=os.getenv("HOME")): - DEVNULL = open(os.devnull, 'w') - command = option.split() - subprocess.Popen(command, cwd=start_dir, start_new_session=True, stdout=DEVNULL, stderr=DEVNULL) + 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)]) + + def execute(self, _command, start_dir=os.getenv("HOME"), use_os_system=None): + if use_os_system: + os.system(_command) + else: + DEVNULL = open(os.devnull, 'w') + command = _command.split() + subprocess.Popen(command, cwd=start_dir, shell=False, start_new_session=True, stdout=DEVNULL, stderr=DEVNULL) + def do_action_from_menu_controls(self, imagemenuitem, eventbutton): @@ -138,11 +146,13 @@ class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFil self.copy_files() if action == "paste": self.paste_files() + if action == "archive": + self.show_archiver_dialogue() if action == "delete": # self.delete_files() self.trash_files() - if action == "trash": - self.trash_files() + if action == "go_to_trash": + self.builder.get_object("path_entry").set_text(self.trash_files_path) self.ctrlDown = False diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller_Data.py b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller_Data.py index 8220192..1272883 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller_Data.py +++ b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller_Data.py @@ -1,35 +1,69 @@ # Python imports # Gtk imports +from gi.repository import GLib # Application imports from shellfm import WindowController + + class Controller_Data: def has_method(self, o, name): return callable(getattr(o, name, None)) def setup_controller_data(self): - self.window_controller = WindowController() - self.state = self.window_controller.load_state() + self.window_controller = WindowController() + self.state = self.window_controller.load_state() - self.builder = self.settings.builder - self.logger = self.settings.logger + self.builder = self.settings.builder + self.logger = self.settings.logger - self.window = self.settings.getMainWindow() - self.window1 = self.builder.get_object("window_1") - self.window2 = self.builder.get_object("window_2") - self.window3 = self.builder.get_object("window_3") - self.window4 = self.builder.get_object("window_4") - self.message_widget = self.builder.get_object("message_widget") - self.message_view = self.builder.get_object("message_view") - self.message_buffer = self.builder.get_object("message_buffer") + self.window = self.settings.getMainWindow() + self.window1 = self.builder.get_object("window_1") + self.window2 = self.builder.get_object("window_2") + self.window3 = self.builder.get_object("window_3") + self.window4 = self.builder.get_object("window_4") + self.message_widget = self.builder.get_object("message_widget") + self.message_view = self.builder.get_object("message_view") + self.message_buffer = self.builder.get_object("message_buffer") + self.arc_command_buffer = self.builder.get_object("arc_command_buffer") self.bottom_size_label = self.builder.get_object("bottom_size_label") self.bottom_file_count_label = self.builder.get_object("bottom_file_count_label") self.bottom_path_label = self.builder.get_object("bottom_path_label") + self.trash_files_path = GLib.get_user_data_dir() + "/Trash/files" + self.trash_info_path = GLib.get_user_data_dir() + "/Trash/info" + + + # In compress commands: + # %n: First selected filename/dir to archive + # %N: All selected filenames/dirs to archive, or (with %O) a single filename + # %o: Resulting single archive file + # %O: Resulting archive per source file/directory (use changes %N meaning) + # + # In extract commands: + # %x: Archive file to extract + # %g: Unique extraction target filename with optional subfolder + # %G: Unique extraction target filename, never with subfolder + # + # In list commands: + # %x: Archive to list + # + # Plus standard bash variables are accepted. + self.arc_commands = [ '$(which 7za || echo 7zr) a %o %N', + 'zip -r %o %N', + 'rar a -r %o %N', + 'tar -cvf %o %N', + 'tar -cvjf %o %N', + 'tar -cvzf %o %N', + 'tar -cvJf %o %N', + 'gzip -c %N > %O', + 'xz -cz %N > %O' + ] + self.notebooks = [self.window1, self.window2, self.window3, self.window4] self.selected_files = [] self.to_rename_files = [] diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/ShowHideMixin.py b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/ShowHideMixin.py index 84dccab..6d03cff 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/ShowHideMixin.py +++ b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/ShowHideMixin.py @@ -19,16 +19,33 @@ class ShowHideMixin: self.hide_about_page() def hide_about_page(self, widget=None, eve=None): - about_page = self.builder.get_object("about_page").hide() + self.builder.get_object("about_page").hide() + + def show_archiver_dialogue(self, widget=None, eve=None): + archiver_dialogue = self.builder.get_object("archiver_dialogue") + archiver_dialogue.set_action(Gtk.FileChooserAction.SAVE) + archiver_dialogue.set_select_multiple(True) + archiver_dialogue.set_current_name("arc.7z") + + response = archiver_dialogue.run() + if response == Gtk.ResponseType.OK: + self.archive_files(archiver_dialogue) + if (response == Gtk.ResponseType.CANCEL) or (response == Gtk.ResponseType.DELETE_EVENT): + pass + + archiver_dialogue.hide() + + def hide_archiver_dialogue(self, widget=None, eve=None): + self.builder.get_object("archiver_dialogue").hide() def show_appchooser_menu(self, widget=None, eve=None): appchooser_menu = self.builder.get_object("appchooser_menu") appchooser_widget = self.builder.get_object("appchooser_widget") + response = appchooser_menu.run() - resp = appchooser_menu.run() - if resp == Gtk.ResponseType.CANCEL: + if response == Gtk.ResponseType.CANCEL: self.hide_appchooser_menu() - if resp == Gtk.ResponseType.OK: + if response == Gtk.ResponseType.OK: self.open_with_files(appchooser_widget) self.hide_appchooser_menu() diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetFileActionMixin.py b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetFileActionMixin.py index 5d9e2f7..c4e1b41 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetFileActionMixin.py +++ b/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetFileActionMixin.py @@ -129,6 +129,20 @@ class WidgetFileActionMixin: self.hide_new_file_menu() self.to_rename_files.clear() + def archive_files(self, archiver_dialogue): + wid, tid = self.window_controller.get_active_data() + iconview = self.builder.get_object(f"{wid}|{tid}|iconview") + store = iconview.get_model() + paths = self.format_to_uris(store, wid, tid, self.selected_files, True) + + save_target = archiver_dialogue.get_filename(); + start_itr, end_itr = self.arc_command_buffer.get_bounds() + command = self.arc_command_buffer.get_text(start_itr, end_itr, False) + + command = command.replace("%o", save_target) + command = command.replace("%N", ' '.join(paths)) + final_command = f"terminator -e '{command}'" + self.execute(final_command, start_dir=None, use_os_system=True) diff --git a/user_config/solarfm/Main_Window.glade b/user_config/solarfm/Main_Window.glade index cb63f5f..bcb481c 100644 --- a/user_config/solarfm/Main_Window.glade +++ b/user_config/solarfm/Main_Window.glade @@ -452,6 +452,170 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe appchooser_select_btn + + $(which 7za || echo 7zr) a %o %N + + + False + True + center + dialog + center + True + True + + + False + vertical + 2 + + + False + end + + + gtk-cancel + True + True + True + True + + + True + True + 0 + + + + + gtk-ok + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + + + True + False + True + + + True + False + Compress Commands: + 0.20000000298023224 + + + + + + False + True + 0 + + + + + + + + True + False + Archive Format: + 1 + + + + + + False + True + 2 + + + + + True + False + 0 + 0 + + 7Zip (*.7z) + Zip (*.zip *.ZIP) + RAR (*.rar *.RAR) + Tar (*.tar) + Tar bzip2 (*.tar.bz2) + Tar Gzip (*.tar.gz *.tgz) + Tar xz (*.tar.xz *.txz) + Gzip (*.gz) + XZ (*.xz) + + + + + False + True + 3 + + + + + False + True + 0 + + + + + 72 + True + True + arc_command_buffer + + + True + True + 1 + + + + + False + True + 2 + + + + + + button2 + button3 + + + + True + False + gtk-save-as + True False @@ -1645,6 +1809,24 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe 4 + + + gtk-paste + paste + True + True + True + Paste... + True + True + + + + False + True + 5 + + Go To Trash @@ -1661,25 +1843,25 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False True end - 5 + 6 - gtk-paste - paste + Archive + archive True True True - Paste... - True + Archive... + archive_img True False True - 6 + 7