From 9697e8ca169c6e945687a40c86501222569d09e2 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Tue, 25 Oct 2022 23:27:21 -0500 Subject: [PATCH] Moving to use ContextMenu --- plugins/archiver/manifest.json | 2 +- plugins/archiver/plugin.py | 11 +- plugins/file_properties/plugin.py | 12 +- plugins/movie_tv_info/manifest.json | 2 +- plugins/movie_tv_info/plugin.py | 12 +- plugins/searcher/plugin.py | 14 +- plugins/trasher/plugin.py | 53 ++-- plugins/trasher/trasher.glade | 126 -------- plugins/vod_thumbnailer/manifest.json | 2 +- plugins/vod_thumbnailer/plugin.py | 11 +- .../SolarFM/solarfm/__builtins__.py | 1 - .../solarfm-0.0.1/SolarFM/solarfm/__main__.py | 2 +- .../SolarFM/solarfm/core/controller_data.py | 85 ++++++ .../solarfm/core/mixins/show_hide_mixin.py | 4 +- .../SolarFM/solarfm/plugins/manifest.py | 3 +- .../usr/share/solarfm/Main_Window.glade | 280 ------------------ 16 files changed, 154 insertions(+), 466 deletions(-) delete mode 100644 plugins/trasher/trasher.glade diff --git a/plugins/archiver/manifest.json b/plugins/archiver/manifest.json index 761a2eb..5d9fc1b 100644 --- a/plugins/archiver/manifest.json +++ b/plugins/archiver/manifest.json @@ -5,7 +5,7 @@ "version": "0.0.1", "support": "", "requests": { - "ui_target": "context_menu", + "ui_target": "context_menu_plugins", "pass_fm_events": "true" } } diff --git a/plugins/archiver/plugin.py b/plugins/archiver/plugin.py index ccfd732..5426094 100644 --- a/plugins/archiver/plugin.py +++ b/plugins/archiver/plugin.py @@ -81,13 +81,12 @@ class Plugin(PluginBase): self._archiver_dialogue = self._builder.get_object("archiver_dialogue") self._arc_command_buffer = self._builder.get_object("arc_command_buffer") - icon = Gtk.Image(stock=Gtk.STOCK_FLOPPY) - button = Gtk.Button(label=self.name) + item = Gtk.ImageMenuItem(self.name) + item.set_image( Gtk.Image(stock=Gtk.STOCK_FLOPPY) ) + item.connect("activate", self.show_archiver_dialogue) + item.set_always_show_image(True) + return item - button.set_image(icon) - button.connect("button-release-event", self.show_archiver_dialogue) - - return button def run(self): ... diff --git a/plugins/file_properties/plugin.py b/plugins/file_properties/plugin.py index c20bc1a..e28d1e3 100644 --- a/plugins/file_properties/plugin.py +++ b/plugins/file_properties/plugin.py @@ -99,13 +99,11 @@ class Plugin(PluginBase): self._file_group = self._builder.get_object("file_group") def generate_reference_ui_element(self): - icon = Gtk.Image(stock=Gtk.STOCK_PROPERTIES ) - button = Gtk.Button(label=self.name) - - button.connect("button-release-event", self._show_properties_page) - button.set_image(icon) - - return button + item = Gtk.ImageMenuItem(self.name) + item.set_image( Gtk.Image(stock=Gtk.STOCK_PROPERTIES) ) + item.connect("activate", self._show_properties_page) + item.set_always_show_image(True) + return item @threaded diff --git a/plugins/movie_tv_info/manifest.json b/plugins/movie_tv_info/manifest.json index 9290b70..2bff10f 100644 --- a/plugins/movie_tv_info/manifest.json +++ b/plugins/movie_tv_info/manifest.json @@ -5,7 +5,7 @@ "version": "0.0.1", "support": "", "requests": { - "ui_target": "context_menu", + "ui_target": "context_menu_plugins", "pass_fm_events": "true" } } diff --git a/plugins/movie_tv_info/plugin.py b/plugins/movie_tv_info/plugin.py index 2bae410..f16f282 100644 --- a/plugins/movie_tv_info/plugin.py +++ b/plugins/movie_tv_info/plugin.py @@ -70,13 +70,11 @@ class Plugin(PluginBase): self._trailer_link = self._builder.get_object("trailer_link") def generate_reference_ui_element(self): - icon = Gtk.Image(stock=Gtk.STOCK_FIND) - button = Gtk.Button(label=self.name) - - button.connect("button-release-event", self._show_info_page) - button.set_image(icon) - - return button + item = Gtk.ImageMenuItem(self.name) + item.set_image( Gtk.Image(stock=Gtk.STOCK_FIND) ) + item.connect("activate", self._show_info_page) + item.set_always_show_image(True) + return item @threaded def _show_info_page(self, widget=None, eve=None): diff --git a/plugins/searcher/plugin.py b/plugins/searcher/plugin.py index ab63097..17eaa63 100644 --- a/plugins/searcher/plugin.py +++ b/plugins/searcher/plugin.py @@ -80,13 +80,11 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase): self.create_ipc_listener() def generate_reference_ui_element(self): - icon = Gtk.Image(stock=Gtk.STOCK_FIND) - button = Gtk.Button(label=self.name) - - button.connect("button-release-event", self._show_page) - button.set_image(icon) - - return button + item = Gtk.ImageMenuItem(self.name) + item.set_image( Gtk.Image(stock=Gtk.STOCK_FIND) ) + item.connect("activate", self._show_page) + item.set_always_show_image(True) + return item def _show_page(self, widget=None, eve=None): @@ -113,6 +111,7 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase): self.grep_list_parent.add(self._grep_list) self.grep_list_parent.show_all() + time.sleep(0.05) Gtk.main_iteration() def reset_file_list_box(self) -> None: @@ -128,4 +127,5 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase): self.file_list_parent.add(self._file_list) self.file_list_parent.show_all() + time.sleep(0.05) Gtk.main_iteration() diff --git a/plugins/trasher/plugin.py b/plugins/trasher/plugin.py index 78cc759..69618d9 100644 --- a/plugins/trasher/plugin.py +++ b/plugins/trasher/plugin.py @@ -47,34 +47,49 @@ class Plugin(PluginBase): self._event_system.subscribe("trash_files", self.trash_files) def generate_reference_ui_element(self): - self._builder = Gtk.Builder() - self._builder.add_from_file(self._GLADE_FILE) + trash_a = Gtk.MenuItem("Trash Actions") + trash_menu = Gtk.Menu() - 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.restore = Gtk.MenuItem("Restore From Trash") + self.restore.connect("activate", self.restore_trash_files) - self._builder.connect_signals(handlers) + self.empty = Gtk.MenuItem("Empty Trash") + self.empty.connect("activate", self.empty_trash) - trasher = self._builder.get_object("trasher") - trasher.show_all() + trash = Gtk.ImageMenuItem("Trash") + trash.set_image( Gtk.Image.new_from_icon_name("user-trash", 16) ) + trash.connect("activate", self.trash_files) + trash.set_always_show_image(True) - return trasher + go_to = Gtk.ImageMenuItem("Go To Trash") + go_to.set_image( Gtk.Image.new_from_icon_name("user-trash", 16) ) + go_to.connect("activate", self.go_to_trash) + go_to.set_always_show_image(True) + + delete = Gtk.ImageMenuItem("Delete") + delete.set_image( Gtk.Image(stock=Gtk.STOCK_DELETE) ) + delete.connect("activate", self.delete_files) + delete.set_always_show_image(True) + + trash_a.set_submenu(trash_menu) + trash_a.show_all() + self._appen_menu_items(trash_menu, [self.restore, self.empty, trash, go_to, delete]) + + return trash_a + + + def _appen_menu_items(self, menu, items): + for item in items: + menu.append(item) def _show_trash_buttons(self): - self._builder.get_object("restore_from_trash").show() - self._builder.get_object("empty_trash").show() + self.restore.show() + self.empty.show() def _hide_trash_buttons(self): - self._builder.get_object("restore_from_trash").hide() - self._builder.get_object("empty_trash").hide() + self.restore.hide() + self.empty.hide() def delete_files(self, widget = None, eve = None): self._event_system.emit("do_hide_context_menu") diff --git a/plugins/trasher/trasher.glade b/plugins/trasher/trasher.glade deleted file mode 100644 index 2867476..0000000 --- a/plugins/trasher/trasher.glade +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - True - False - user-trash - - - True - False - user-trash - - - True - True - 5 - 10 - True - - - True - False - vertical - - - Restore From Trash - restore_from_trash - True - True - True - Restore From Trash... - - - - False - True - 0 - - - - - Empty Trash - empty_trash - True - True - True - Empty Trash... - 20 - - - - False - True - 1 - - - - - Trash - trash - True - True - True - Move to Trash... - trash_img - True - - - - False - True - 2 - - - - - Go To Trash - go_to_trash - True - True - True - Go To Trash... - trash_img2 - True - - - - False - True - 3 - - - - - gtk-delete - delete - True - True - True - Delete... - 20 - True - True - - - - False - True - 4 - - - - - - - True - False - False - Trash - center - - - - diff --git a/plugins/vod_thumbnailer/manifest.json b/plugins/vod_thumbnailer/manifest.json index 154bd40..21523f0 100644 --- a/plugins/vod_thumbnailer/manifest.json +++ b/plugins/vod_thumbnailer/manifest.json @@ -5,7 +5,7 @@ "version": "0.0.1", "support": "", "requests": { - "ui_target": "context_menu", + "ui_target": "context_menu_plugins", "pass_fm_events": "true" } } diff --git a/plugins/vod_thumbnailer/plugin.py b/plugins/vod_thumbnailer/plugin.py index 694972f..81a97a6 100644 --- a/plugins/vod_thumbnailer/plugin.py +++ b/plugins/vod_thumbnailer/plugin.py @@ -70,12 +70,11 @@ class Plugin(PluginBase): def generate_reference_ui_element(self): pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(f"{self.path}/../../icons/video.png", 16, 16, True) icon = Gtk.Image.new_from_pixbuf(pixbuf) - button = Gtk.Button(label=self.name) - - button.set_image(icon) - button.connect("button-release-event", self._show_thumbnailer_page) - - return button + item = Gtk.ImageMenuItem("Delete") + item.set_image( icon ) + item.connect("activate", self._show_thumbnailer_page) + item.set_always_show_image(True) + return item @threaded 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 9ed03c8..a96c67f 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py @@ -24,7 +24,6 @@ def daemon_threaded_wrapper(fn): - # NOTE: Just reminding myself we can add to builtins two different ways... # __builtins__.update({"event_system": Builtins()}) builtins.app_name = "SolarFM" diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py index b61b260..e1fa0e9 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py @@ -22,7 +22,7 @@ if __name__ == "__main__": """ Set process title, get arguments, and create GTK main thread. """ try: - setproctitle('SolarFM') + setproctitle(f"{app_name}") faulthandler.enable() # For better debug info parser = argparse.ArgumentParser() 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 904a8ad..dabae41 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 @@ -4,6 +4,8 @@ from dataclasses import dataclass # Lib imports import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk from gi.repository import GLib # Application imports @@ -100,6 +102,89 @@ class Controller_Data: if settings.is_debug(): self.window.set_interactive_debugging(True) + self.build_context_menu() + + + def build_context_menu(self) -> None: + main_menu = Gtk.Menu() + open_menu = Gtk.Menu() + filea_menu = Gtk.Menu() + plugins_menu = Gtk.Menu() + open_a = Gtk.MenuItem("Open Actions") + file_a = Gtk.MenuItem("File Actions") + plugins = Gtk.MenuItem("Plugins") + + self._appen_menu_items(main_menu, [open_a, file_a, plugins]) + + open = Gtk.ImageMenuItem("Open") + open.set_name("open") + open.set_image( Gtk.Image(stock=Gtk.STOCK_OPEN) ) + open.set_always_show_image(True) + open.connect("activate", self.do_action_from_menu_controls) + + open_with = Gtk.ImageMenuItem("Open With") + open_with.set_name("open_with") + open_with.set_image( Gtk.Image(stock=Gtk.STOCK_OPEN) ) + open_with.set_always_show_image(True) + open_with.connect("activate", self.do_action_from_menu_controls) + + execute = Gtk.ImageMenuItem("Execute") + execute.set_name("execute") + execute.set_image( Gtk.Image(stock=Gtk.STOCK_EXECUTE) ) + execute.set_always_show_image(True) + execute.connect("activate", self.do_action_from_menu_controls) + + execute_term = Gtk.ImageMenuItem("Execute in Terminal") + execute_term.set_name("execute_in_terminal") + execute_term.set_image( Gtk.Image(stock=Gtk.STOCK_EXECUTE) ) + execute_term.set_always_show_image(True) + execute_term.connect("activate", self.do_action_from_menu_controls) + + self._appen_menu_items(open_menu, [open, open_with, execute, execute_term]) + + new = Gtk.ImageMenuItem("New") + new.set_name("create") + new.set_image( Gtk.Image(stock=Gtk.STOCK_ADD) ) + new.set_always_show_image(True) + new.connect("activate", self.do_action_from_menu_controls) + + rename = Gtk.ImageMenuItem("Rename") + rename.set_name("rename") + rename.set_image( Gtk.Image(stock=Gtk.STOCK_EDIT) ) + rename.set_always_show_image(True) + rename.connect("activate", self.do_action_from_menu_controls) + + cut = Gtk.ImageMenuItem("Cut") + cut.set_name("cut") + cut.set_image( Gtk.Image(stock=Gtk.STOCK_CUT) ) + cut.set_always_show_image(True) + cut.connect("activate", self.do_action_from_menu_controls) + + copy = Gtk.ImageMenuItem("Copy") + copy.set_name("copy") + copy.set_image( Gtk.Image(stock=Gtk.STOCK_COPY) ) + copy.set_always_show_image(True) + copy.connect("activate", self.do_action_from_menu_controls) + + paste = Gtk.ImageMenuItem("Paste") + paste.set_name("paste") + paste.set_image( Gtk.Image(stock=Gtk.STOCK_PASTE) ) + paste.set_always_show_image(True) + paste.connect("activate", self.do_action_from_menu_controls) + + self._appen_menu_items(filea_menu, [new, rename, cut, copy, paste]) + open_a.set_submenu(open_menu) + file_a.set_submenu(filea_menu) + plugins.set_submenu(plugins_menu) + + main_menu.attach_to_widget(self.window, None) + main_menu.show_all() + self.builder.expose_object("context_menu", main_menu) + self.builder.expose_object("context_menu_plugins", plugins_menu) + + def _appen_menu_items(self, menu, items): + for item in items: + menu.append(item) def get_current_state(self) -> State: ''' 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 8377158..239b155 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 @@ -83,10 +83,10 @@ class ShowHideMixin: self.builder.get_object("plugin_controls").hide() def show_context_menu(self, widget=None, eve=None): - self.builder.get_object("context_menu_popup").run() + self.builder.get_object("context_menu").popup_at_pointer(None) def hide_context_menu(self, widget=None, eve=None): - self.builder.get_object("context_menu_popup").hide() + self.builder.get_object("context_menu").popdown() def show_new_file_menu(self, widget=None, eve=None): if widget: diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py index e53c0c5..3d23ecf 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py @@ -56,7 +56,8 @@ class ManifestProcessor: if requests["ui_target"] in [ "none", "other", "main_Window", "main_menu_bar", "main_menu_bttn_box_bar", "path_menu_bar", "plugin_control_list", - "context_menu", "window_1", "window_2", "window_3", "window_4" + "context_menu", "context_menu_plugins", "window_1", + "window_2", "window_3", "window_4" ]: if requests["ui_target"] == "other": if "ui_target_id" in keys: diff --git a/user_config/usr/share/solarfm/Main_Window.glade b/user_config/usr/share/solarfm/Main_Window.glade index fa62070..0176307 100644 --- a/user_config/usr/share/solarfm/Main_Window.glade +++ b/user_config/usr/share/solarfm/Main_Window.glade @@ -457,11 +457,6 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False gtk-new - - True - False - gtk-execute - True False @@ -488,287 +483,12 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe gtk-execute - - True - False - gtk-open - True False gtk-edit 3 - - True - False - gtk-edit - - - False - False - mouse - splashscreen - True - False - False - static - - - - False - vertical - 2 - - - False - end - - - - - - - - - False - False - 0 - - - - - True - False - vertical - - - True - True - 5 - 5 - True - True - - - True - False - vertical - - - gtk-open - open - True - True - True - Open... - True - - - - False - True - 0 - - - - - Open With - open_with - True - True - True - open_with_img - True - - - - False - True - 1 - - - - - gtk-execute - execute - True - True - True - True - - - - False - True - 2 - - - - - Execute in Terminal - execute_in_terminal - True - True - True - exec_in_term_img - - - - False - True - 3 - - - - - - - True - False - False - Open - center - - - - - False - True - 4 - - - - - True - True - 5 - 5 - True - True - - - True - False - vertical - - - gtk-new - create - True - True - True - New File/Folder... - True - - - - False - True - 0 - - - - - Rename - rename - True - True - True - Rename... - rename_img2 - True - - - - False - True - 1 - - - - - gtk-cut - cut - True - True - True - Cut... - True - True - - - - False - True - 2 - - - - - gtk-copy - copy - True - True - True - Copy... - True - True - - - - False - True - 3 - - - - - gtk-paste - paste - True - True - True - Paste... - True - True - - - - False - True - 4 - - - - - - - True - False - False - File Actions - center - end - - - - - False - True - 5 - - - - - False - True - 1 - - - - - False dialog